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

Invokes the block with obj as the proc's parameter like #call. It is to allow a proc object to be a target of when clause in a case statement.

这意味着您可以在 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 同一个方法通常有多种语法,以最好地满足开发者的需要。

既然你是专门问语法的,这跟Proc没有关系。 Ruby 不允许对象改变语言的语法,因此我们谈论的对象类型无关紧要。

my_proc.call("x")

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

返回的对象

你问的是"what makes this syntax work"。好吧,这就是 Ruby 语言规范中指定的消息发送方式。

my_proc.("x")

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

如果你想让这个对你的对象起作用,你需要回复 call

此语法是在 Ruby 1.9 中添加的,使调用 "function-like object" 看起来更像是发送消息,唯一的区别是附加的句点字符。请注意 Ruby 不是唯一使用此语法的语言, 也使用它。

my_proc["x"]

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

的结果

如果你想让它对你的对象起作用,你需要回复 []

Proc#[] 被添加为 Proc#callalias_method,因此调用 "function-like object" 看起来更像是发送消息,唯一的区别是形状括号。在 Ruby 1.9 中添加了 .() 语法糖,我通常更喜欢那个。

my_proc === "x"

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

的结果

如果你想让这个对你的对象起作用,你需要回复 ===

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