Ruby中的()->{ }是什么?

6

我刚刚在一个Ruby/Rails应用程序中看到了这个表达式:

def method(a, b = nil, &c)
   c ||= ->(v) { v }

我理解第一部分,但不了解->() { ... }语法的含义。请问它是什么意思?
为简洁起见,变量名已被更改。我尝试搜索,但非字母数字字符对SEO显然是一场噩梦。

1
可能是 Ruby 中的 -> (stab) 运算符是什么? 的重复问题。 - apneadiving
2
就像其他答案所提到的那样,它是用于创建lambda函数的。这是一篇很好的文章,可以帮助您理解它们。顺便说一下,您可以使用SymbolHound搜索网络上的特殊字符,而Google会忽略它们。 - GMA
2个回答

6

这是一个Lambda字面量。将代码块变量放在()内部,将函数体放在{}内部。

->(x, y){x + y}

在这个例子中,->(v){v} 接收一个参数 v 并返回它,换句话说,它是一个恒等函数。如果将块传递给 method,那么它将被分配给 c。否则,默认情况下会将恒等函数分配给 c

所以,如果你通过引用传递 c,你基本上只是传递 v(到一个块中?)并期望它返回吗? - hohner
3
&c in ruby does not mean "passed by reference", it means c is the proc (aka block) in method( 'foo' ) do; something; end - kik

3

那是一个在Ruby 1.9中引入的lambda文字。

irb> l = ->(v) { v }
# => #<Proc:0x007f4acea30410@(irb):1 (lambda)>
irb> l.call(1)
# => 1

写成下面的形式是等价的:

irb> l = lambda { |v| v }
# => #<Proc:0x00000001daf538@(irb):1 (lambda)> 

在您发布的示例中,它被用于为方法提供默认块,当没有指定时,请考虑以下内容:
def method(a, &c)
  c ||= ->(v) { v }
  c.call(a)
end

method(1)
# => 1
method(1) { |v| v * 2 }
# => 2

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