2012-10-02 46 views
3

從我read爲什麼不這項工作:x.map(:+ 「A」)

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

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

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

第一個按預期工作(我得到[「aA」,「bA」,「cA」,「dA」]),但第二個不管我嘗試什麼都會出錯。

+1

您無法將參數傳遞給這些Symbol#to_proc調用。 – oldergod

回答

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"] 
+0

這是一個非常有趣的答案,謝謝。任何理由爲什麼#send是不夠的,需要__send__? –

+0

這真是太棒了! – severin

1

如果這種方法奏效,那麼作爲一名紅寶石主義者就沒有什麼可做的了。我寫了一個建立在#method_missing上的整個postfix類來解決這個問題。簡單的骯髒的解決方案將是:

x = ?a, ?b, ?c 

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

x.rap :+, "A" 
+0

嘗試過,然後x.rap(&:+「A」),出現錯誤。 Ruby 1.9.3p125 – davej

+0

編輯,這個作品 –