標籤:style blog color 使用 io ar 檔案 資料 art
本系列是《七周七語言》的課後習題答案。這本書不拘泥於文法細節,而是橫向比較各種程式設計語言(非熱門)之間的編程範式。
是本對編程覺悟能有所協助的好書,這裡就不多做介紹了,感興趣的同學不妨去看一下。
不得不說,Ruby的風格很駭客。
1. 列印字串"Hello, world."
puts "Hello, world."
2. 在字串“Hello, Ruby.”中,找出"Ruby."所在下標。
puts "Hello, Ruby." =~ /Ruby/
3. 列印你的名字十遍
puts "angular "*10
4. 列印字串"This is sentence number 1.", 其中的數字1會一直變化到10。
i = 1..10i.each{|x| puts "This is sentence number #{x}.\n"}
5. 從檔案運行Ruby程式
create test1.rb
write -> puts "hello\n"
save and exit
run -> ruby test1.rb
6. 讓玩家猜隨機數,並告訴玩家猜大還是猜小
guess.rb
input = getsrNum = rand(10)if(input.to_i > rNum) puts "bigger than #{rNum}"else puts "not bigger than #{rNum}"end
7. 分別找到用代碼塊和不用代碼塊讀取檔案的方法,用代碼塊有什麼好處?
File.open("test.rb") do |file|file.each_line{|line| puts "Got #{line.dump}"}end
File.open("test.rb").each{|f|puts "Got #{f}"}
用代碼塊可以傳遞傳遞參數,做更多的操作。
8. 如何把散列錶轉換成數組
hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
可以用collect/map
hash.collect { |k, v| v }#returns [["a", "b", "c"], ["b", "c"]]
也可以用values
hash.values
9. ruby的數組可以做棧,還能用來做什麼資料結構
可以用來作隊列,鏈表,棧,集合等等。
10. 有一個數組,包含16個數字。僅用each方法列印數組中的內容,一次列印4個數字,然後,用可枚舉模組的each_slice方法重新做一遍。
myArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]myArray.each do |a| if a % 4 == 0 print "#{a}\n" else print "#{a} " endend
require ‘enumerator‘myArray =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]myArray.each_slice(4) {|a| p a}
11. 寫一個可以接受散列表和數組嵌套結構的樹類tree
12. 寫一個簡單的grep程式,把檔案中出現某片語的的行權都列印出來。順便加上行號。
puts "grep #{ARGV[0]};"File.open("e:/ruby/reg.txt") do |file|lnNum = 0 file.each_line do |ln| lnNum +=1 p "Line:#{lnNum} => #{ln}" if ln =~ /#{ARGV[0]}/ endend
13. 修改前面的CSV應用程式,使它可以用each方法返回CsvRow對象。然後,在CsvRow對象上,對某個給定標題,用method_missing方法返回標題所在的列的值。
比如,對於包含以下內容的檔案:
one,two
lions,tigers
API可以像下面這樣操作:
csv=RubyCsv.new
csv.each(|row| puts row.one)
這會列印出"lions"
module ActsAsCsv def self.included(base) base.extend ClassMethods end module ClassMethods def acts_as_csv include InstanceMethods end end module InstanceMethods def read @csv_contents = [] filename = self.class.to_s.downcase + ‘.txt‘ file = File.new(filename) @headers = file.gets.chomp.split(‘, ‘) file.each do |row| @csv_contents << row.chomp.split(‘, ‘) end end def each self.csv_contents.each do |row| i = CsvRow.new(row) yield i end end attr_accessor :headers, :csv_contents def initialize read end endendclass CsvRow def initialize(row) @contents = row end def method_missing name, *args num = name.to_s if num == ‘one‘ @contents[0] elsif num == ‘two‘ @contents[1] end endendclass RubyCsv include ActsAsCsv acts_as_csvendm = RubyCsv.newputs "Start...\n";m.each do |row| puts row.oneendputs "end...\n"
其中自訂了Csvrow類,重寫了該類的method_missing方法,使得預設的one/two方法可以成為參數靈活使用。
總結:
Ruby的開放類和模組(能寫程式的程式),使得程式員可以把行為附加在文法上,這有別於傳統的類繼承。
《七周七語言:理解多種編程範型》のruby課後習題答案