ruby的動態性

2021-08-26 22:51:38 字數 1685 閱讀 8850

記住: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

類物件的單例類有時被稱為元類,有時「元類」也泛指所有的單例類。

ruby的動態性 eval 家族

eval 將字串作為 來求值,最直接,也是最危險的方法。編寫乙個讓別人在執行時鍵入方法名的方法 print method name m gets.chomp eval def puts hi end eval m 如果在執行時,輸入abc,那麼eval求值的字串是 def abc puts hi e...

Ruby的OOP與動態特性

本圖書摘選來自amazon 銷量最好的三本ruby書之一 the ruby way 第二版的中文版 ruby之道 已由人民郵電出版社出版 第11章,介紹了一些不常見或較高階的oop技術以及一些常見的用法。同時介紹了一些設計模式的實現 以及一些不需要實現的模式 還討論ruby的反射api ruby的動...

Swift的動態性

動態性比較重要的一點就是能夠拿到某個類所有的方法 屬性,我們使用如下 來列印方法和屬性列表。動態性最常用的就是方法替換 method swizzling 將類的某個方法替換成自定義的方法,從而達到hook的作用。objc 用來將swift的api匯出給objective c和objective c ...