something {|i| i.foo }
something(&:foo)
是等价的。因此,如果x =%w(a b c d),为什么不是以下等价物:
x.map {|s| s.+ "A"}
x.map {&:+ "A"}
?
第一个按预期工作(我得到[“aA”,“bA”,“cA”,“dA”]),但第二个不管我尝试什么都会出错。
something {|i| i.foo }
something(&:foo)
是等价的。因此,如果x =%w(a b c d),为什么不是以下等价物:
x.map {|s| s.+ "A"}
x.map {&:+ "A"}
?
第一个按预期工作(我得到[“aA”,“bA”,“cA”,“dA”]),但第二个不管我尝试什么都会出错。
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"]
这是一个非常有趣的答案,谢谢。任何理由为什么#send是不够的,需要__send__? –
这真是太棒了! – severin
如果这种方法奏效,那么作为一名红宝石主义者就没有什么可做的了。我写了一个建立在#method_missing
上的整个postfix类来解决这个问题。简单的肮脏的解决方案将是:
x = ?a, ?b, ?c
def x.rap(sym, arg)
map {|e| e.send sym, arg }
end
x.rap :+, "A"
尝试过,然后x.rap(&:+“A”),出现错误。 Ruby 1.9.3p125 – davej
编辑,这个作品 –
您无法将参数传递给这些Symbol#to_proc调用。 – oldergod