文章目錄
- ruby的模組
- Mix-in
- require和load
- 模組總結
- 數組
- 字串
- Regex
- 迭代器,代碼塊,閉包
ruby的模組
ruby用module...end定義模組。模組提供了一個名字空間,可以防止命名衝突。
module Me
def foo()
return 0;
end
end
要使用me模組中的函數可以:
include Me
foo()
如果連續inclde了多個模組,而這些模組中有同名的函數,那麼前面的函數將被後面include的函數覆蓋。
標準庫裡提供了很多模組,Math模組提供了大量數字相類的方法,比如Math.sqrt。前面使用模組都是用include模組名然後調用方法來
實現的,這個include有點像c++中的using
namespace,有時候我們希望不include也能使用,就像Math.sqrt一樣使用,因為這樣可以防止include的多個模組中有重名的情
況。這時我們需要把函數定義為模組函數。
module Me2
def Me2.foo()
end
end
下面我們不需要include Me2就可以用Me2.foo()來調用了。
外界不僅可以訪問模組裡的函數,還可以訪問模組裡的常量。常量的訪問方式是module::常量名。
Mix-in
可以把一個模組中定義的函數整個放入到一個類裡去。
class Person
include Me
end
這樣,Person類裡就有foo()方法了,可以
p = Person.new
p.foo()
與include方式對應,還有一個extend方法。include是為整個類加入這個模組的方法,extend可以為某個類的單個執行個體加入模組的方法。
p1 = Person.new
p1.extend(Me2)
require和load
require類似於c++中的include,用來包括另一個檔案,它們的區別在於:
require只載入一次,遇到同一檔案時會忽略,不過不同路徑下的同名檔案會多次載入。
load會多次載入,只要運行到load語句就會載入一次。所以利用load的特性,可以實現系統的無縫升級,程式功能改變時只需要重新load一下就行了。
模組總結
require,load用於負載檔案,include,extend用於包含模組。
require載入一次,load載入多次。
require負載檔案時可以不加尾碼,load必須加尾碼。
require一般用於載入庫檔案,load一般用於載入設定檔。
數組
arr1 = []
arr2 = Array.new
arr3 = [4, 5, 6]
ruby中的數組用整數作下標,下標從0開始,與c語言一致。可以使用負數下標,表示從末尾開始索引,如arr3[-1]表示最後一個元素,上例中是6。
可以用一對數字來索引數組,第一個數字表示開始位置,第二個數字表示數目,所以arr3[1..2]表示的是[4, 5]。
ruby中數組是動態,隨時可以添加/刪除元素。
arr3[6] = 45; #把索引為6的元素設定為45,索引為3,4,5的元素都是nil
arr3.delete_at(3) #刪除下標為3的元素
arr3.delete(5) #刪除值為5的所有元素
arr3.insert(3, 66) #在下標為3的位置添加元素66
arr.pop #刪除最後一個元素
arr.shift #刪除第一個元素
arr.clear #清空數組
print arr.join(",") #把數組join成一個字串輸入,每個元素間用,分割
字串
str1 = 'str'
str2 = "str"
str3 = %q/str/
str4 = %Q(str)
str5 = <<OK_str
dksla;f
str
OK_str
%q用來產生單引號字串,%Q產生雙引號字串,%q和%Q後面跟分隔字元,可以是配對的! !; / /; < >; ( ); [ ]; { };等
str5是一個字串文檔,從<<後跟一個文檔結束符,字串從下一行開始,一直到遇到文檔結束符為止,所以str5的實際內容是
dksla;f
str
字串中可以使用類似於c語言的轉義符,比如"/n",也可以用#{}嵌入ruby運算式,運算式會被求值然後和字串串連到一起。
Regex迭代器,代碼塊,閉包
(1..9).each{|i| print i if i < 7}
迭代器each是數組類的一個方法,{}中的代碼是代碼塊,除了用{},還可以用do...end組織代碼塊。{}的優先順序高於do...end。