繁体   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