標籤:ruby
DAY 3
學習進入第三天,今天計劃學習模組,集合以及簡單的檔案操作。
3.1Mixin 模組
物件導向語言使用繼承,來將行為傳播到相似的對象上。具體到語言,C++使用的是多繼承,但是過於複雜,Java採用介面的方式,而Ruby則選擇使用了模組,先來看下代碼:
module ToFile def filename "object_#{self.object_id}.txt" end def to_f file = File.open(filename,‘w‘) file.write(to_s) endendclass Person include ToFile attr_accessor:name def initialize(name) @name = name end def to_s name endenda = Person.new(‘Lee‘)puts a.name,a.to_s,a.to_f
我們定義了一個ToFile的module模組,而在類Person裡面include了它(感覺有點像是C++中的include)。
- 通過這樣的include,Person類直接具有了ToFile的能力,而且他們建立了某種關係,使得在ToFile中也可以調用Person類裡面的方法。通過先定義類的主要部分,然後通過模組添加額外的能力,這種隨插即用式的做法顯然相當靈活,這種做法我們稱之為mixin。
3.2 集合操作
集合用法並無什麼特別之處,無非就是一些方法的使用:
puts ‘begin‘<=>‘end‘a=[4,5,2,1]a= a.sortputs aputs a.any? { |i| i>6 }puts a.all? { |i| i>0 }puts a.collect { |i| i*2 }puts a.select { |i|i%2==0 }puts a.maxputs a.member?(2)
- <=>被人們叫做太空船操作符,它比較a、b兩運算元,b較大返回-1,a較大返回1,相等返回0。
- 只要集合中任一元素條件為真,any?就返回true;只有集合所有元素條件為真,all?才返回true。
- 只要對應的類實現了太空船操作符,就可以調用sort方法排序
- collect和map方法把函數應用到每個元素上,並返回結果數組
- find方法找到一個合格元素,而select和find_all方法均返回所有合格元素。
3.3 檔案操作
我們在3.1中已經使用了檔案的寫入,檔案的讀取也很簡單:
File.open("tree.rb", "r") do |file| file.each_line("\r\n"){|line| puts "#{line.to_s}"}end
上面代碼使用了代碼塊,而如果不使用代碼塊,需要手動close檔案。
file = File.open("tree.rb", "r") file.each_line("\r\n"){|line| puts "#{line.to_s}"}file.close
我們也可以使用更簡單的IO類:
IO.foreach("tree.rb"){|line| puts line}
3.4 今日實踐
寫一個簡單的grep程式,把檔案中出現某片語的行全都列印出來,並輸出行號。
def grep(filename,match) line_num=0 IO.foreach(filename)do|line| line_num=line_num+1 puts line_num.to_s+" "+line if line.match(match) end endgrep("tree.rb",/[Tt]ree/)
Ruby七天入門(3 Mixin,集合,檔案操作)