Symbol to Proc - po prostu nie działa

irb(main):001:0> ['a', 'b', 'c'].collect(&:capitalize) TypeError: wrong argument type Symbol (expected Proc) from (irb):1
Jakieś pomysły?

Odpowidź

class Symbol def to_proc Proc.new { |obj, *args| obj.send(self, *args) } end end
A ja myślałem, ze jest to wbudowane w Ruby…

Sprawdzane w irb oraz w konsoli railsów

['a', 'b', 'c'].collect(&:capitalize) => ["A", "B", "C"]
ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

a, w fedorze 11 mam ruby 1.8.6 ;]

A ta metoda to nie jest czasem w ActiveSupport?

Długa historia, generalnie była w Railsach, potem została backportowana do Ruby 1.8.7 z gałęzi 1.9, potem jakiś syf (regresja i rozwalenie railsów) się w związku z tym pojawił, a na końcu chyba wypadła z railsów.
Generalnie tego typu konstrukcje najlepiej zawęzić do pisania w Ruby 1.9, tylko wtedy będą w 100% bezpieczne.

Albo dodać kod testujący czy taka metoda istnieje. Ja tak robię w .irbrc bo jednak wygoda pisania z wykorzystaniem tej metody jest ogromna :).

unless Symbol.method_defined?(:to_proc) class Symbol def to_proc return Proc.new {|*args| args.shift.send(self, *args) } end end end