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?!
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?!
由于您具体询问语法,因此与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不是使用此语法的唯一语言,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
条件下,它们都使用===
以确定物体是否能够被包含的Unten一个类别。
关于===
:
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"
红宝石往往具有相同的方法不同的句法,以最适合的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 - >这一个被说成是 “语法糖” ,隐藏方法的名称以获得更紧凑的语法。
你的问题是什么? –
如果您阅读[手册](http://ruby-doc.org/core-2.2.3/Proc.html),则可以回答大部分问题。 –