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?!
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?!
由於您具體詢問語法,因此與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不是使用此語法的唯一語言,elixir也使用它。
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一個類別。
關於===
:
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"
紅寶石往往具有相同的方法不同的句法,以最適合的develloper需求。
my_proc === "x"
:http://ruby-doc.org/core-2.2.0/Proc.html#method-i-3D-3D-3D - >這一個據說是在case
報表很有幫助(@Marek_Lipka在他的回答解釋進一步)my_proc["x"]
:http://ruby-doc.org/core-2.2.0/Proc.html#method-i-5B-5D - >這一個被說成是 「語法糖」 ,隱藏方法的名稱以獲得更緊湊的語法。
你的問題是什麼? –
如果您閱讀[手冊](http://ruby-doc.org/core-2.2.3/Proc.html),則可以回答大部分問題。 –