在Ruby中,你如何称呼"->"运算符?

247
  1. 以下代码中,你如何称呼 -> 运算符?

    ->(...) do
      ...
    end
    
  2. 以下代码片段不是等价的吗?

  3. succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    

86
无法在Google中搜索“->”真是令人烦恼——这是一个很好的问题! - Kevin
10
@Kevin,你可以使用Stack Overflow内置的弹性搜索来搜索"->"title:"->" [ruby] is:question。关键是要使用引号。 - user456814
8
Symbolhound也可以做到这一点:http://symbolhound.com/?q=-%3E+ruby - Andrew Grimm
9
烦人与否不重要,但是搜索“ruby ->”请求会将此问题作为首个顶部结果。 - fl-web
3个回答

278

Ruby编程语言中,使用->定义的lambda被称为lambda字面量

succ = ->(x){ x+1 }
succ.call(2)
代码相当于以下内容。
succ = lambda { |x| x + 1 }
succ.call(2)

口头上,我听说过它被称为刺猬lambda刺猬字面量


142

=> 等于 Hash Rocket

在哈希映射的字面量中将键与值分开。


-> 等于 Dash Rocket

用于在Ruby 1.9.X(无参数)和Ruby 2.X(有参数)中定义lambda字面量。你给出的例子(->(x) { x * 2 }lambda { |x| x * 2 })实际上是等效的。


14
注意:如果您使用 do/end 关键字,这两种风格并不完全可以互换,因为存在优先级规则。 这将打印一个经过检查的 lambda:puts -> do 1 end。这将将块传递给 puts,从 lambda 中窃取它并导致 ArgumentError:puts lambda do 1 end - Kelvin
1
此外,Ruby 1.9.3的lambda字面量确实允许参数。 - Kelvin
3
这是因为Ruby试图将puts lambda do 1 end解释为puts(lambda) do 1 end而不是puts(lambda do 1 end)。后者实际上可以工作 - 如果加上括号,Ruby就会将块传递给lambda方法而不是puts方法。 - PJSCopeland
1
@PJSCopeland 我并不是说你不能让它们表现得一样。我是说它们在语法上并非完全可互换,也就是说,在某些情况下你不能简单地进行替换(因为有时你需要额外的括号来使用 lambda)。 - Kelvin
@rdurand,你是否使用“Stabby lambdas cannot accept arguments in Ruby 1.9”作为编辑摘要?这并不准确,至少对于1.9.3版本而言——参数是允许的。 - Kelvin

5

->(x) { ... }lambda { |x| ... } 是等价的,都会创建一个lambda函数。请参见Kernel#lambda。 lambda是proc类型的一种,它能够确保传递给它的参数数量是正确的。还可以参见Proc::newKernel#proc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接