簡體   English   中英

Ruby Proc語法用法

[英]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"

Ruby通常針對同一方法具有多種語法,以最適合develloper的需求。

  • my_proc === "x"http : my_proc === "x" >據說這在case語句中很有用( @Marek_Lipka在回答中進一步解釋了這一點)
  • my_proc["x"]http : my_proc["x"] >據說這是“語法糖”,隱藏了方法的名稱以獲得更緊湊的語法。

由於您是專門詢問語法的,因此與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不是唯一使用此語法的語言,而使用它。

my_proc["x"]

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

如果要使此功能適用於您的對象,則需要響應[]

Proc#[]被添加為Proc#callalias_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM