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 同一个方法通常有多种语法,以最好地满足开发者的需要。
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 -> 这个据说是 "syntax sugar",为了更紧凑的语法隐藏了方法的名称。
既然你是专门问语法的,这跟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 不是唯一使用此语法的语言,elixir 也使用它。
my_proc["x"]
这是 my_proc.[]("x")
的语法糖,即将带有参数 "x"
的消息 []
发送到评估 my_proc
.
的结果
如果你想让它对你的对象起作用,你需要回复 []
。
Proc#[]
被添加为 Proc#call
的 alias_method
,因此调用 "function-like object" 看起来更像是发送消息,唯一的区别是形状括号。在 Ruby 1.9 中添加了 .()
语法糖,我通常更喜欢那个。
my_proc === "x"
这是 my_proc.===("x")
的语法糖,即将带有参数 "x"
的消息 ===
发送到评估 my_proc
.
的结果
如果你想让这个对你的对象起作用,你需要回复 ===
。
这是为了 Proc
s 可以用作 case
表达式和 Enumerable#grep
中的条件,两者都使用 ===
来确定是否一个对象可以归入一个类别。
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 同一个方法通常有多种语法,以最好地满足开发者的需要。
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 -> 这个据说是 "syntax sugar",为了更紧凑的语法隐藏了方法的名称。
既然你是专门问语法的,这跟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 不是唯一使用此语法的语言,elixir 也使用它。
my_proc["x"]
这是 my_proc.[]("x")
的语法糖,即将带有参数 "x"
的消息 []
发送到评估 my_proc
.
如果你想让它对你的对象起作用,你需要回复 []
。
Proc#[]
被添加为 Proc#call
的 alias_method
,因此调用 "function-like object" 看起来更像是发送消息,唯一的区别是形状括号。在 Ruby 1.9 中添加了 .()
语法糖,我通常更喜欢那个。
my_proc === "x"
这是 my_proc.===("x")
的语法糖,即将带有参数 "x"
的消息 ===
发送到评估 my_proc
.
如果你想让这个对你的对象起作用,你需要回复 ===
。
这是为了 Proc
s 可以用作 case
表达式和 Enumerable#grep
中的条件,两者都使用 ===
来确定是否一个对象可以归入一个类别。