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