来自我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”]),但是无论我尝试什么,第二个都会出错。
答案 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"