Ruby中的“->”运算符是什么?

48
在下面的例子中:
default: -> { Time.now }

什么是->?我熟悉=>,但这是我第一次见到->
1个回答

59

这是 Ruby 1.9 中的“刺猬lambda”运算符。例如,请参见2008年的此文章

简而言之:

> foo2 = ->(arg) { arg * 2 }
> foo2.call "now"
 => nownow

请注意->(arg)之间缺少空格,这是有意为之的。


3
我相当确定在 ->(arg) 之间不需要加空格。我刚在运行着 ruby 1.9.3p484irb 中试过了。不确定这个空格是否在之前的版本中是必需的。或者,你是想用 "intentional" 来作为一种编码风格以增加清晰度吗? - zealoushacker
2
啊,糟糕,我明白了。在使用括号时,需要加上空格,但是括号本身并不是必需的。因此,foo2 = -> arg { arg*2 } 是有效的语法。 - zealoushacker
3
@zealoushacker 正确 :-) 在我看来,省略括号会更加令人困惑,但这不是技术上的争议,而是文体上的问题,所以我不会争辩这个。 - Dave Newton
1
不确定链接是什么,但表达式使用了“刺人的lambda”操作符,正如Dave所说。它允许您定义一个匿名方法(参见lambda、Proc.new等)。请注意,原始问题中的-> { #code }语法创建了一个没有参数的方法,也可以写成->() { #code },看起来更像Dave的带一个参数->(arg) { #code }的示例。尽管上下文不幸地与Ruby 1.9的哈希语法无关,但整个表达式也可以在Ruby 1.8中编写为{:default => lambda{ Time.now }} - Andrew
1
@zealoushacker 关于间距问题,如果你在使用括号时在箭头后面加上空格,Ruby 1.9会报错。例如:-> (x) { x }。但是在Ruby 2.x中允许这样做。 - Kelvin

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