|
1. [1, "string", 2, ["nested", "array"]] 數(shù)組元素可以使用任意對象 arr=[1,2,"str",[1,2,4]] p arr[3] #輸出[1,2,4] p arr[-1] #輸出[1,2,4] arr.each { |item| p item } #輸出1 2 "str" [1,2,4] 2. 在Ruby中,無論是變量還是常量,全都保持著引用(reference)。因此,將一個變量賦值給另一個變量時,不會發(fā)生復制。 Ruby變量的首字符表示變量的類型(作用域)。 以小寫字母或下劃線開頭的表示局部變量。 變量名以大寫字母開頭的是常量 根據(jù)Ruby的變量命名規(guī)則,第一個字母決定類型。實例變量是“@”。 變量名以@@開頭的就是類變量。 在程序的任何位置都可以對全局變量進行賦值和訪問。變量名的第一個字符為$的就是全局變量 最初的賦值兼做變量聲明,無需額外聲明。變量是無類型的,因此,無論何種類型,都可以無差別的賦值 Str="HelloWorld" Str="Yes" # Str是常量,Ruby將拋出警告: warning: already initialized constant Str 3.對于條件表達式,只有兩個對象——false和nil——為假,其余所有對象都是真。0和空字符串也是真 if i <10 then p i end while i<10 do p i end 4. Ruby的類名與常量名是等價的。那么,與類名同名的常量是什么呢?實際上,就是這個類。在Ruby中,所有能操作的東西都是對象。 類自然也是對象。這種對象稱為類對象。所有的類對象都是Class類的實例。 也就是說,創(chuàng)建新類對象的class語句, 其動作是將類對象賦值給一個與類同名的常量。另一方面,生成實例的操作是,訪問這個常量,通過該對象調用方法(通常是new) 在方法執(zhí)行過程中,通常會保留自己(方法調用的實例)是誰的信息,這個信息可以通過self得到。類似于C++或Java中的this。 使用this,Ruby將拋出異常 有時需要對一個類進行特定的初始化。這時要修改的不是new方法,而是一個名為initialize的方法。它會在new的過程中調用。 5. 只能指定一個超類??雌饋鞷uby似乎是單一繼承。但是,因為模塊的存在讓它擁有了與多重繼承同等的能力。下面就來討論一下模塊。 一言以蔽之,模塊就是“無法指定超類,無法生成實例”的類。定義可以這樣寫。 然而它無法直接調用,因此不能創(chuàng)建實例。那么該怎么用呢?應該由其它類“include”這個模塊。這樣一來,就好像類繼承自這個模塊一樣 module M def myupcase( str ) return str.upcase() end end class C include M end p(C.new().myupcase("content")) # 顯示"CONTENT" M的定義必須在C的定義前面,否則將拋出異常 class Cls def test() return "class" end end module Mod def test() return "module" end end class C < Cls include Mod end p(C.new().test()) # “class”? “module”? 模塊和類哪邊更“近 6. 開頭加上::,表示“這是一個定義在頂層的常量”。就像文件系統(tǒng)的路徑一樣。假設根目錄下有個叫vmunix的文件。 在/下只寫vmunix就可以訪問它。而在全路徑下就要寫/vmunix。Const和::Const也是同樣的關系。在頂層下,可以只寫Const, 也可以按照全路徑寫::Const。 class SomeClass Const = 3 end p(::SomeClass::Const) # 顯示3 p( SomeClass::Const) # 同樣顯示3 class C1 # ::C1 ConstC1="ConstC1"; class C2 # ::C::C2 ConstC2="ConstC2"; class C3 # ::C::C2::C3 ConstC3="ConstC3"; end end end p ::C1::C2::ConstC2 #顯示 ConstC2 7. 頂層、類定義語句內、模塊定義語句內、方法體內,都有各自完全獨立的局部變量作用域。 Ruby程序執(zhí)行過程中,到處都設置了self。就連頂層和類定義語句中都有self。 比如,頂層甚至也有self。頂層的self稱為main。沒什么奇怪的,它就是Object的實例。 main僅僅是為了設置self而準備的,沒有什么更深層的含義。 因為頂層的self,也就是main,是Object的實例,所以,即便是在頂層也可以調用Object的方法。 而且Object包含了一個稱為Kernel模塊,其中定義了“函數(shù)風格的方法”,像p、puts。(圖10)。 因此,即便在頂層也可以調用p和puts。 8. Ruby對于程序庫的加載也全都是在執(zhí)行時進行的。通常這樣寫。 Ruby代碼 require("library_name") 同看到的一樣,require是一個方法。根本沒有保留字。這樣寫的話,就在其所寫的地方執(zhí)行加載,執(zhí)行就轉移到那個程序庫(的代碼)。 因為Ruby中沒有Java中包的概念,如果希望劃分程序庫名稱的名字空間,就將文件分開放置到目錄里。 9. 使用模塊作為名字空間 # net程序庫的名字空間劃分的例子 module Net class SMTP # ... end class POP # ... end class HTTP # ... end end 10. singleton方法(singleton method) 對象可以調用方法??梢哉{用的方法由對象的類決定。但是理想情況下,方法是屬于對象的。 至于類,它的存在是為了省去多次同樣方法的時間。 實際上,Ruby有一種機制,可以為對象(實例)單獨定義方法,無論它們的類是什么。這樣寫。 Ruby代碼 obj = Object.new() def obj.my_first() puts("My first singleton method") end obj.my_first() # 顯示My first singleton method 眾所周知,Object是所有類的超類。在這么重要的類中,不可能定義一個像my_first名稱這樣怪異的方法。 obj是Object的實例。但是,obj卻可以調用my_first方法。 也就是說,肯定在哪定義了這個與所屬類完全沒有關系的方法。這樣為某個對象定義的方法稱為singleton方法(singleton method)。
|
|
|
來自: 昵稱612P5 > 《Ruby(Rails)》