2015-11-06 65 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"