[英]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"
由于您是专门询问语法的,因此与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不是唯一使用此语法的语言,而elixir也使用它。
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
,两者都使用===
来确定对象是否可以归入类别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.