ruby中的可呼叫物件 方法

2022-05-14 10:59:17 字數 2204 閱讀 1839

上一篇講了ruby中的可呼叫物件proc和lambda,他們都是塊轉換成的物件。ruby中的可呼叫物件還有方法。通過使用method方法,並且以方法名作為引數(字串或者符號),就可以得到乙個方法物件。

如下:

1

classc2

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物件。

如下:(在上面**的基礎上)

1

class 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關鍵字相當於改變了這個方法。它並不是直接呼叫了匹配路徑上的第二個方法。而是在匹配到的第乙個方法裡呼叫第二個方法。還有,如果要呼叫匹配路徑上的第三個匹配到的方法呢?第四個呢?這個就可以用到繫結的方法了。

如下:

1

classc2

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...