你在Ruby中称为 - >运算符是什么?

Mat*_*mat 197 ruby syntax

  1. 您如何称呼->运营商,如下所示?

    ->(...) do
      ...
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这些片段不是等效的吗?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    
    Run Code Online (Sandbox Code Playgroud)

kia*_*uno 225

Ruby Programming Language("Methods,Procs,Lambdas,and Closures")中,使用的lambda ->称为lambda literal.

succ = ->(x){ x+1 }
succ.call(2)
Run Code Online (Sandbox Code Playgroud)

代码等同于以下代码.

succ = lambda { |x| x + 1 }
succ.call(2)
Run Code Online (Sandbox Code Playgroud)

非正式地,我听说它被称为stabby lambdastabby literal.


Yar*_*rin 122

=>== 哈希火箭

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


->== 短跑火箭

用于在Ruby 1.9.X(不带args)和Ruby 2.X(带args)中定义lambda文字.你给出的例子(->(x) { x * 2 }&lambda { |x| x * 2 })实际上是等价的.

  • FYI如果因为优先规则而使用`do` /`end`,则2种样式不能完全互换.这打印出一个被检查的lambda:`puts - > do 1 end`.这会将块传递给`puts`,从lambda中窃取它并导致ArgumentError:`puts lambda do 1 end` (7认同)
  • @Kelvin那是因为Ruby试图将`puts lambda do 1 end`解释为`puts(lambda)do 1 end`而不是`puts(lambda do 1 end)`.后者确实有效 - 如果没有括号,Ruby只是尝试将块传递给`puts`方法而不是`lambda`方法. (2认同)
  • @PJSCOpeland 我并不是说你不能让他们采取同样的行动。我是说它们在语法方面并不是 100% 可互换的,即你不能在所有情况下简单地进行直接替换(因为有时你需要额外的括号来表示“lambda”)。 (2认同)

Dou*_*len 5

拉姆达火箭

我是从这篇文章中得到的。但首先谷歌搜索 ruby​​ lambda 速记 http://ruby-journal.com/becareful-with-space-in-lambda-hash-rocket-syntax-between-ruby-1-dot-9-and-2-dot -0/


Car*_*and 5

->(x) { ... }是相同的lambda { |x| ... }。它创建了一个 lambda。请参阅Kernel#lambda lambda 是 proc 的一种类型,可确保传递给它的参数数量是正确的。另请参见Proc::newKernel#proc