上一篇講了ruby中的可呼叫物件proc和lambda,他們都是塊轉換成的物件。ruby中的可呼叫物件還有方法。通過使用method方法,並且以方法名作為引數(字串或者符號),就可以得到乙個方法物件。
如下:
1classc2
deftalk
3 p "
hello world"4
end5
end6
7 c =c.new
8 meth =c.method :talk
9 meth.call
輸出: "hello world"
類c有個例項方法talk。類c的例項c呼叫方法method,並且用:talk做引數,得到乙個方法物件meth。然後meth呼叫call,輸出"hello world"。
值得注意的是,meth這個方法物件是繫結在物件c上的方法。呼叫call的時候,也知道是c在呼叫talk方法。
可以用method#unbind()方法來把乙個方法跟它繫結的物件相分離,該方法返回乙個unboundmethod物件,不能執行unboundmethod物件,必須把它繫結到乙個物件上,使之再次成為乙個method物件。
如下:(在上面**的基礎上)
1class d 2end
3 d =d.new
4 unbound =meth.unbind
5 new_meth =unbound.bind(d)
6 new_meth.call
輸出: "hello world"
unbind解綁之後,繫結到c的子類d的乙個例項物件d上。再對方法物件呼叫call。如果不想對乙個已繫結的方法進行解綁,可以用如下的**得到解綁物件:
unbound = c.instance_method (:talk)
為什麼要這樣呢?存在總是合理的,繫結與解綁也有它的適用之處。
在之前《ruby中的方法查詢》中,我們知道ruby的方法呼叫是根據匹配到的第乙個方法來呼叫的。那麼如果要呼叫匹配路徑上的匹配到的第二個方法呢?ruby中有super這個關鍵字。但是加入super關鍵字相當於改變了這個方法。它並不是直接呼叫了匹配路徑上的第二個方法。而是在匹配到的第乙個方法裡呼叫第二個方法。還有,如果要呼叫匹配路徑上的第三個匹配到的方法呢?第四個呢?這個就可以用到繫結的方法了。
如下:
1classc2
defmethod
3 p "
this is in c"4
end5
end6
7class d 8def
method
9 p "
this is in d"10
end11
end12
13class e 14def
method
15 p "
this is in e"16
end17
end18
19 e =e.new
20e.method
2122
d.instance_method(:method).bind(e).call
23 c.instance_method(:method).bind(e).call
輸出:"this is in e"
"this is in d"
"this is in c"
如**所示,定義類c,d,e,d繼承c,e繼承d。他們都定義了方法method。那麼e的例項e的方法查詢路徑上這三個method都可以呼叫。如果直接呼叫e.method。那麼肯定是呼叫了第乙個匹配的方法,也就是類e中的方法,如輸出的第一行。如果要呼叫類d中的方法method呢?如**22行。把d的例項方法繫結到物件e上,然後在呼叫。呼叫類c中的方法method,同理。如23行。
學過c++的話,看到這個可能會想到派生類指標引用基類物件。派生類是基類的特例,所以只有強制轉換型別之後才能引用基類的物件。和ruby中的繫結類似,只有和父類的方法繫結以後,才能呼叫父類的方法。
ruby中可以被呼叫的物件有:
塊(不算是物件,可以被呼叫),proc(proc類的物件),lambda(proc類的物件),這三種都是在定義它們的作用域中執行。
方法:繫結於物件,在所繫結的物件的作用域中執行。
將一種物件轉換成另一種物件的方法有:proc.new(),method#to_proc(),&操作符
可呼叫物件
我們可以向演算法傳遞任何類別的可呼叫物件 函式,函式指標,過載了函式呼叫運算子的類,lambda 表示式,bind 函式。函式物件 1 如果類過載了函式呼叫運算子,則我們可以像使用函式一樣使用該類的物件。因為這樣的類同時也能儲存狀態,所以與普通函式相比他們更加靈活。例 struct absint i...
可呼叫物件
在python中可以用callable函式檢視乙個物件是不是可呼叫 1 deffn 2print ha ha ha 34callable fn 5 true 乙個類被例項化後,這個例項物件是乙個不可呼叫物件 1 class fun 2def init self,name 3 self.name na...
C 中的可呼叫物件
之前對c 中的多種可呼叫物件的使用總感覺很模糊,今天重新翻看了一下,總結成文如下。c 中有如下幾種可呼叫物件 函式 函式指標 lambda表示式 bind物件 函式物件。其中lambda表示式和bind物件是c 11標準中提出的 bind機制並不是新標準中首次提出,而是對舊版本中bind1st和bi...