天天看點

ruby 基礎知識(二)

ruby  中的動态方法 http://singleant.iteye.com/blog/1680382

Rails 大量使用了符号(symbol)。符号看上去很像變量名,不過以冒号作為字首。符号的例子包

括:action、:line_items、:id 等。可以把符号看作字元串文本,不過——如同魔法般地——被變成

了常量。

可以把冒号看作“名字叫做……的東西”,是以:id 的意思就是“名字叫做id 的東西”。

Rails 用符号來給别的東西打上标記。尤其是,Rails 常常用符号來給方法參數命名,以及用作

hash 的鍵。譬如說:

redirect_to :action => "edit" , :id => params[:id]

===

在類定義的主體部分,可以定義類方法和執行個體方法。隻要在方法名的前面加上"self.”字首(請看

上述代碼的第5 行),就可以讓它成為類方法:可以在類層面上調用它。以上述代碼為例,我們可以在應

用程式的任何地方進行下列調用:

to_collect = Order.find_all_unpaid

通常的方法定義(請看第9 行對total 方法的定義)則會建立出執行個體方法(instance method)。

執行個體方法必須在對象層面上調用。在下面的例子中,order 變量引用一個Order 對象,total()方法的

定義如前所述。

puts "The total is #{order.total}"

可以看到find_all_unpaid()和total()方法之間的差異。前者并不特定針對某一份訂單,因

此我們在類層面上定義它,并通過Order 類來調用它;後者隻對一份訂單生效,是以我們将其定義為實

例方法,并針對一個特定的Order 對象來調用它。

==

對象将内部狀态儲存在執行個體變量(instance variable)中,執行個體變量的名字必須以“@”開頭,

所有執行個體方法都可以通路它們。每個對象擁有各自獨立的一組執行個體變量

==

子產品和類有相似之處:它們都包含一組方法、常量,以及其他類和子產品的定義。但和類不同的是,

你無法建立子產品的執行個體。

==

數組的一個常用方法是<<,該方法會把一個值附加到數組的尾端。

ages = []

for person in @people

ages << person.age

end

==

Ruby 的hash 與數組非常相似。hash 字面量使用大括号,而不是方括号,并且其中的每個條目必

須由兩個對象組成:前者是索引鍵,後者是值。譬如說,可以這樣建立“樂器”與“樂器種類”之間的對

應關系。

inst_section = {

:cello => 'string' ,

:clarinet => 'woodwind' ,

:drum => 'percussion' ,

:oboe => 'woodwind' ,

:trumpet => 'brass' ,

:violin => 'string'

}

=>左邊的東西是索引鍵,右邊的是與之對應的值。在同一個hash 中,索引鍵必須唯一,也就是說

你不能為:drum 建立兩個條目。hash 中的鍵和值可以是任意對象——你甚至可以在hash 中儲存數組或

者别的hash.在Rails 中,通常使用符号來作為hash 的索引鍵。

==

正規表達式可以用于指定字元的組合模式(pattern),并将其與字元串相比對。在Ruby 中,建立

正規表達式的方式通常是/pattern/或者%r{pattern}。

譬如說,你可以編寫一個模式,使之比對包含“Perl”或者“Python”的字元串。這個正則表達

式的寫法是/Perl|Python/。

if line =~ /P(erl|ython)/

puts "There seems to be another scripting language here"

end

還可以在模式中指定重複字元(repetition)。例如/ab+c/可以比對到這樣的字元串:其中包含

一個“a”,其後是一個或多個“b”,再然後是一個“c”。如果把模式中的加号變成星号,/ab*c/比對到

的則是這樣的字元串:一個“a”,然後是0 個或多個“b”,再然後是一個"c”。

==

簡單地說,代碼塊(block)就是大括号或者do...end 之間的代碼。按照慣例,單行的代碼塊使用

大括号,多行的代碼塊使用do/end。

{ puts "Hello" } # this is a block

do ###

club.enroll(person) # and so is this

person.socialize #

end ###

代碼塊隻能出現在方法調用的後面:代碼塊的開始标記必須緊跟在方法調用的同一行。譬如說,在

下列代碼中,包含了“puts "Hi"”的代碼塊緊跟着對greet()方法的調用。

greet { puts "Hi" }