在Ruby中,您怎么称呼->运算符?


205
  1. 您如何称呼->运营商?

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

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

70
您无法在Google上搜索“->”,这很烦人!
凯文

10
@Kevin,但是,您可以使用Stack Overflow的内置Elastic Search搜索"->"title:"->" [ruby] is:question。关键是使用引号。

8
Symbolhound也可以这样做:symbolhound.com/?q=
Andrew Grimm

7
烦人或不烦人,但谷歌搜索“ ruby​​->”请求,将给出该问题的链接作为第一热门结果。
fl-web

6
@Kevin可能在过去两年中发生了变化,但是在谷歌上搜索ruby "->"是我发现此帖子的方式:)
Nippysaurus

Answers:


238

Ruby编程语言(“方法,过程,Lambda和闭包”)中,使用定义的Lambda ->称为lambdaliteral

succ = ->(x){ x+1 }
succ.call(2)

该代码等效于以下代码。

succ = lambda { |x| x + 1 }
succ.call(2)

非正式地,我听说它被称为稳定的lambda稳定的文字


127

=>== 哈希火箭

将键与哈希映射文字中的值分开。


->== 短跑火箭

用于在Ruby 1.9.X(无args)和Ruby 2.X(有args)中定义lambda文字。您给出的示例(->(x) { x * 2 }lambda { |x| x * 2 })实际上是等效的。


10
仅供参考,由于优先规则,如果您使用do/ end,则这两种样式不能完全互换。这会打印一个检查过的lambda :puts -> do 1 end。这会将代码块传递给puts,从lambda上窃取它并导致ArgumentError:puts lambda do 1 end
Kelvin

1
此外,ruby 1.9.3的lambda文字确实允许使用参数。
开尔文

3
@Kelvin可能是因为Ruby尝试将解释puts lambda do 1 endputs(lambda) do 1 end而不是puts(lambda do 1 end)。后者确实可以工作-Ruby只是尝试将块传递给puts方法,而不是lambda没有括号的情况下传递给方法。
PJSCopeland '17

1
@PJSCopeland我并不是说您不能让他们采取同样的行动。我说的是它们不是100%可互换的语法,也就是说,您不能在所有情况下都简单地进行即插即用替换(因为有时您需要使用额外的括号lambda)。
开尔文

@rdurand您是否使用摘要“ Stabby lambdas无法在Ruby 1.9中接受参数”进行编辑?这是不准确的,至少对于1.9.3-允许使用args。
开尔文


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.