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" }