首页 > 解决方案 > 为多个字段做&符号在红宝石中不起作用

问题描述

在红宝石中,我可以做到

['Hi', 'Yo'].map(&:upcase)

但是,如果我想同时获得两者:upcase怎么:downcase办?

两者都不

['Hi', 'Yo'].map(&[:upcase,:downcase])

也不

['Hi', 'Yo'].map([&:upcase,&:downcase])

工作。:(

标签: ruby

解决方案


你在这里有什么:

['Hi', 'Yo'].map(&:upcase)

实际上是一个简短的版本:

['Hi', 'Yo'].map(&:upcase.to_proc)

这是一个变体:

['Hi', 'Yo'].map(&->(s) { s.send(:upcase) })

或者换句话说:

['Hi', 'Yo'].map { |s| s.upcase }

&:x符号实际上是此类情况的一种特殊情况的简写,并且仅适用于单数符号。你可以做的是to_proc大致像这样定义一个方法:

class Array
  def to_proc
    ->(i) { inject(i) { |v, m| v.send(m) } }
  end
end

该方法必须返回一个Proc对象,即“lambda”,它在此处使用 Ruby-> (...) { ... }表示法定义。

然后你可以这样称呼它:

['Hi', 'Yo'].map(&[:upcase, :downcase, :to_sym].to_proc)
# => [:hi, :yo]

推荐阅读