为什么这不起作用:x.map(&:+“A”)

时间:2012-10-02 02:30:24

标签: ruby ruby-1.9 ampersand

来自我read

something {|i| i.foo } 
something(&:foo)

是等价的。因此,如果x =%w(a b c d),为什么不是以下等价物:

x.map {|s| s.+ "A"}
x.map {&:+ "A"}

第一个按预期工作(我得到[“aA”,“bA”,“cA”,“dA”]),但是无论我尝试什么,第二个都会出错。

2 个答案:

答案 0 :(得分:6)

Symbol::to_proc不接受参数。

您可以向to_proc添加Array方法。

class Array
  def to_proc
    lambda { |o| o.__send__(*self) }
  end
end

# then use it as below
x.map &[:+, "a"]

答案 1 :(得分:1)

如果这样有效,那么你就像红宝石一样无所事事。我在#method_missing上编写了一个完整的postfix类来解决这个问题。简单的脏解决方案是:

x = ?a, ?b, ?c

def x.rap( sym, arg )
  map {|e| e.send sym, arg }
end

x.rap :+, "A"