Ruby Proc语法用法

时间:2015-11-06 08:31:36

标签: ruby proc

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?!

3 个答案:

答案 0 :(得分:2)

关于===

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"

答案 1 :(得分:2)

Ruby通常有相同方法的几种语法,以最好地满足develloper的需求。

答案 2 :(得分:1)

由于您具体询问语法,因此这与Proc无关。 Ruby不允许对象改变语言的语法,因此我们所讨论的对象并不重要。

my_proc.call("x")

这只是标准的消息发送语法。它将带有参数call的消息"x"发送到通过计算表达式my_proc返回的对象。

您在问“这种语法的作用是什么”。好吧,这就是Ruby语言规范中指定消息发送的方式。

my_proc.("x")

这是my_proc.call("x")的语法糖,即我们上面的内容:将带有参数call的消息"x"发送到评估my_proc的结果。

如果您希望对对象进行此操作,则需要回复call

在Ruby 1.9中添加了这种语法,使调用“类函数对象”看起来更像是发送消息,唯一的区别是附加句点字符。请注意,Ruby不是使用此语法的唯一语言,也使用它。

my_proc["x"]

这是my_proc.[]("x")的语法糖,即将带有参数[]的消息"x"发送到评估my_proc的结果。

如果您希望对对象进行此操作,则需要回复[]

Proc#[]被添加为alias_method的{​​{1}},因此调用“类似函数的对象”看起来更像是发送消息,唯一的区别是括号。通过在Ruby 1.9中添加Proc#call语法糖,我通常更喜欢那个。

.()

这是my_proc === "x" 的语法糖,即将带有参数my_proc.===("x")的消息===发送到评估"x"的结果。

如果您希望对对象进行此操作,则需要回复my_proc

这已添加,以便===可用作Proc表达式和case中的条件,两者都使用Enumerable#grep来确定对象是否有可以归入一个类别。