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?!
答案 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的需求。
my_proc === "x"
:http://ruby-doc.org/core-2.2.0/Proc.html#method-i-3D-3D-3D
- >据说这篇文章在case
语句中很有用(@Marek_Lipka在答案中进一步解释)my_proc["x"]
:http://ruby-doc.org/core-2.2.0/Proc.html#method-i-5B-5D - >这个被称为“语法糖”,隐藏方法的名称以获得更紧凑的语法。答案 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不是使用此语法的唯一语言,elixir也使用它。
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
来确定对象是否有可以归入一个类别。