[英]Ruby Proc syntax usage
my_proc = proc{|x| "this is #{x}"}
給定my_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?!
關於===
:
http://ruby-doc.org/core-2.2.0/Proc.html#method-i-3D-3D-3D
proc === obj→result_of_proc
使用obj作為proc的參數(如#call)調用該塊。 它允許proc對象成為case語句中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"
由於您是專門詢問語法的,因此與Proc
無關。 Ruby不允許對象更改語言的語法,因此我們在討論哪種對象都沒有關系。
my_proc.call("x")
這只是標准消息發送語法。 它將帶有參數"x"
的消息call
發送到通過評估表達式my_proc
返回的對象。
您在問“什么使此語法起作用”。 好的,這就是在Ruby Language Specification中指定消息發送的方式。
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
,兩者都使用===
來確定對象是否可以歸入類別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.