記住:ruby的動態特性是以self身份的轉換為基礎的。
單例類先來看看什麼是單例類。大多數ruby程式中發生的都涉及包含例項方法定義的類和模組:
class c
def talk
puts "hi!"
endend
使用下面的方法例項化和例項方法呼叫:
c = c.new
c.talk
還可以直接給單個物件新增方法:
obj = object.new
def obj.talk
puts "hi!"
endobj.talk
像這樣在特定物件上新增的方法稱為單例方法。如果為乙個給定的物件定義了單例方法,那麼只有該物件可以呼叫該方法。
單例方法最常見的是類方法(因為普通的類也是物件,又稱類物件,這些類都是class類的例項):
class ticket
def ticket.most_expensive(tickets)
endend
單例方法定義在何處
物件的單例方法定義在物件的單例類中。每乙個物件實際上有兩上類:
* 多個物件例項共享的類
* 單例類
可以將某個物件的單例類看作是它獨有的方法儲存區,僅僅由物件擁有,其他物件不能分防享。
直接檢查和修改單例類
單例類是匿名的。使用下面的記法來開啟單例類的定義:
class << object
# method and constant definitions here
end class << str def twice self + " " + self endend puts str.twice 輸出:i am a string i am string twice方法是str的單例方法。用下面的**,效果是一樣的: def str.twice self + " " + self end使用class << 定義類方法: class ticket class << self def most_expensive(tickets) endend endclass << self經常用來定義類方法(此時的self是這個類物件本身)。 不管是什麼物件,都可以使用該技術開啟物件的單例類的定義體。這意味著,在這個定義體內所做的事都屬於該物件。 方法查詢路徑上的單例類 物件的單例類出現在方法查詢路徑上的第乙個位置。單例類是物件的個人方法儲存區,所以最先搜尋。由單例類混含進來的模組,先於物件所屬類查詢,也先於物件所屬類混含的任何模組查詢。 以上的意思是說:在方法查詢的時候,單例類的內容永遠優先於其他查詢。 深入類方法 類方法是為class類的物件定義的單例方法。在很多方面和其他的單例方法相似,但也有它特別的地方:為類物件定義的單例言法可以被該類的子類呼叫。 class c enddef c.a_class_method puts "singleton method defined on c" endc.a_class_method class d < c d.a_class_method 類物件的單例類有時被稱為元類,有時「元類」也泛指所有的單例類。 eval 將字串作為 來求值,最直接,也是最危險的方法。編寫乙個讓別人在執行時鍵入方法名的方法 print method name m gets.chomp eval def puts hi end eval m 如果在執行時,輸入abc,那麼eval求值的字串是 def abc puts hi e... 本圖書摘選來自amazon 銷量最好的三本ruby書之一 the ruby way 第二版的中文版 ruby之道 已由人民郵電出版社出版 第11章,介紹了一些不常見或較高階的oop技術以及一些常見的用法。同時介紹了一些設計模式的實現 以及一些不需要實現的模式 還討論ruby的反射api ruby的動... 動態性比較重要的一點就是能夠拿到某個類所有的方法 屬性,我們使用如下 來列印方法和屬性列表。動態性最常用的就是方法替換 method swizzling 將類的某個方法替換成自定義的方法,從而達到hook的作用。objc 用來將swift的api匯出給objective c和objective c ...ruby的動態性 eval 家族
Ruby的OOP與動態特性
Swift的動態性