【问题标题】:What do you call the &: operator in Ruby? [duplicate]你如何称呼 Ruby 中的 &: 运算符? [复制]
【发布时间】:2011-01-16 14:47:40
【问题描述】:

可能的重复:
Ruby/Ruby on Rails ampersand colon shortcut
What does map(&:name) mean in Ruby?

我正在阅读 Stackoverflow 并偶然发现以下代码

array.map(&:to_i)

好的,很容易看到这段代码的作用,但我想了解更多关于我以前从未见过的 &: 构造的信息。

不幸的是,我能想到的只是“lambda”,但事实并非如此。 Google 告诉我 Ruby 中的 lambda 语法是 ->->(x,y){ x * y }

那么任何人都知道那个神秘的&: 是什么以及除了调用单个方法之外它还能做什么?

【问题讨论】:

标签: ruby


【解决方案1】:

这里有一些动人的部分,但正在发生的事情的名称是Symbol#to_proc 转换。这是 Ruby 1.9 及更高版本的一部分,如果您使用更高版本的 Rails,也可以使用。

首先,在 Ruby 中,:foo 的意思是“符号 foo”,所以它实际上是两个独立的运算符,而不是一个大的 &: 运算符。

当您说 foo.map(&bar) 时,您是在告诉 Ruby,“向 foo 对象发送一条消息以调用 map 方法,其中包含我已经定义的名为 bar 的块”。如果bar 还不是Proc 对象,Ruby 将尝试将其变为一个。

在这里,我们实际上并没有传递一个块,而是一个名为bar符号。因为我们在Symbol 上有一个隐式的to_proc 转换可用,Ruby 看到并使用它。原来这个转换是这样的:

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end

这会产生一个proc,它调用与符号同名的方法。使用您的原始示例将它们放在一起:

array.map(&:to_i)

这会在数组上调用.map,并且对于数组中的每个元素,返回对该元素调用to_i 的结果。

【讨论】:

  • map(&:to_i) 与 map { |x| 完全相同x.to_i }。由于 map 需要块并且从 ruby​​ 1.9 开始,Symbol to_proc 转换是隐式可用的。
猜你喜欢
  • 2012-01-18
  • 2014-01-16
  • 2013-02-14
  • 1970-01-01
  • 2011-04-12
  • 2012-11-06
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多