以下代码中,你如何称呼
->
运算符?->(...) do ... end
以下代码片段不是等价的吗?
succ = ->(x) {x + 1}
succ = lambda {|x| x + 1}
在Ruby编程语言中,使用->
定义的lambda被称为lambda字面量。
succ = ->(x){ x+1 }
succ.call(2)
代码相当于以下内容。succ = lambda { |x| x + 1 }
succ.call(2)
口头上,我听说过它被称为刺猬lambda或刺猬字面量。
=>
等于 Hash Rocket在哈希映射的字面量中将键与值分开。
->
等于 Dash Rocket用于在Ruby 1.9.X(无参数)和Ruby 2.X(有参数)中定义lambda字面量。你给出的例子(->(x) { x * 2 }
和 lambda { |x| x * 2 }
)实际上是等效的。
do
/end
关键字,这两种风格并不完全可以互换,因为存在优先级规则。 这将打印一个经过检查的 lambda:puts -> do 1 end
。这将将块传递给 puts
,从 lambda 中窃取它并导致 ArgumentError:puts lambda do 1 end
。 - Kelvinputs lambda do 1 end
解释为puts(lambda) do 1 end
而不是puts(lambda do 1 end)
。后者实际上可以工作 - 如果加上括号,Ruby就会将块传递给lambda
方法而不是puts
方法。 - PJSCopelandlambda
)。 - Kelvin->(x) { ... }
和 lambda { |x| ... }
是等价的,都会创建一个lambda函数。请参见Kernel#lambda。 lambda是proc类型的一种,它能够确保传递给它的参数数量是正确的。还可以参见Proc::new和Kernel#proc。
"->"
:title:"->" [ruby] is:question
。关键是要使用引号。 - user456814