2015-11-06 70 views
0
my_proc = proc{|x| "this is #{x}"} 

給定my_proc,什麼使得以下語法有效?Ruby Proc語法使用

my_proc.call("x") # makes sense 

my_proc.("x") # not really sure but ok 

my_proc["x"] # uhhh.... 

my_proc === "x" # what the deuce?! 
+1

你的問題是什麼? –

+1

如果您閱讀[手冊](http://ruby-doc.org/core-2.2.3/Proc.html),則可以回答大部分問題。 –

回答

1

由於您具體詢問語法,因此與Proc s無關。 Ruby不允許對象改變語言的語法,因此,我們正在談論什麼類型的對象並不重要。

my_proc.call("x") 

這只是標準的消息發送語法。它通過評估表達式my_proc將帶有參數"x"的消息call發送給返回的對象。

你在問「是什麼讓這種語法工作」。那麼,這只是如何在Ruby語言規範中指定消息發送。

my_proc.("x") 

這是my_proc.call("x")語法糖,即正是我們上面有:用爭論"x"發送消息call以評估my_proc的結果。

如果您想爲您的對象做這項工作,您需要回復call

在Ruby 1.9中添加了這種語法,使得調用「類似函數的對象」看起來更像是發送消息,唯一的區別是附加的句點字符。請注意,Ruby不是使用此語法的唯一語言,也使用它。

my_proc["x"] 

這是my_proc.[]("x")的句法糖,即發送帶有參數"x"的消息[]到評估結果my_proc

如果你想使這個工作適合你的對象,你需要回復[]

Proc#[]加入作爲Proc#call一個alias_method,以便調用一個「功能狀物體」看起來更像發送消息,與作爲托架的形狀,唯一的區別。 Ruby 1.9中添加了.()語法糖,我通常更喜歡那個。

my_proc === "x" 

這是my_proc.===("x")語法糖,即具有參數"x"發送消息===到評估my_proc的結果。

如果您想爲您的對象做這項工作,您需要回復===

將其加入以使Proc小號可以用作在case表達式和Enumerable#grep條件下,它們都使用===以確定物體是否能夠被包含的Unten一個類別。

2

關於===

http://ruby-doc.org/core-2.2.0/Proc.html#method-i-3D-3D-3D

PROC === OBJ→result_of_proc

調用所有與obj像#CALL的PROC的參數塊。 允許proc對象成爲 聲明中的when子句的目標。

這意味着你可以在case語句中使用它,就像這樣:

odd = proc { |x| x % 2 != 0 } 
even = proc { |x| x % 2 == 0 } 
case 1 
when odd then 'odd' 
when even then 'even' 
end 
# => "odd"