【问题标题】:what is the functionality of "&: " operator in ruby? [duplicate]ruby 中“&:”运算符的功能是什么? [复制]
【发布时间】:2012-03-14 20:21:25
【问题描述】:

可能重复:
What does map(&:name) mean in Ruby?

我遇到了一个代码 sn-p,它有以下内容

a.each_slice(2).map(&:reverse)

我不知道&: 运算符的功能。这是如何运作的?

【问题讨论】:

标签: ruby


【解决方案1】:

Ruby 中没有&: 运算符。您看到的是应用于:symbol& 运算符。

在方法参数列表中,& 运算符获取其操作数,如果还没有将其转换为 Proc 对象(通过在其上调用 to_proc)并将其传递给方法,就好像块已被使用。

my_proc = Proc.new { puts "foo" }

my_method_call(&my_proc) # is identical to:
my_method_call { puts "foo" }

所以问题现在变成了“Symbol#to_proc 做什么?”,这在the Rails documentation 中很容易看到:

将符号转换为简单的过程,这对于枚举特别有用。例子:

# The same as people.collect { |p| p.name }
people.collect(&:name)

# The same as people.select { |p| p.manager? }.collect { |p| p.salary }
people.select(&:manager?).collect(&:salary)

【讨论】:

  • 你是在暗示它,但最好明确地告诉它:这是 Rails 所做的修改,它不是 Ruby 本身内置的。
  • 你是对的 - 我刚刚在普通的 irb (1.8.7) 中尝试过,它在 Ruby 本身中。这不是 Rails 提供的。感谢您纠正我的错误!
  • @kikito:实际上它最初是在 Rails 中实现的,但每个人都喜欢它,所以它进入了核心。
  • 请不要回答重复的问题。只需投票关闭。这个问题已经被问和回答了 17(!!!) 次了,进一步传播知识确实没有任何收获
【解决方案2】:

通过在符号前面添加&,您正在创建一个 lambda 函数,该函数将在传递给此函数的对象上调用具有该符号名称的方法。考虑到这一点:

ar.map(&:reverse)

大致相当于:

ar.map { |element| element.reverse }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2013-12-02
    • 2016-03-22
    • 1970-01-01
    • 2021-12-04
    • 2011-03-02
    • 2010-11-26
    相关资源
    最近更新 更多