sevos
September 24, 2009, 4:18pm
1
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…
morgoth
September 24, 2009, 4:23pm
2
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]
sevos
September 24, 2009, 4:48pm
3
a, w fedorze 11 mam ruby 1.8.6 ;]
ronin
September 24, 2009, 6:37pm
4
A ta metoda to nie jest czasem w ActiveSupport?
Tomash
September 24, 2009, 7:46pm
5
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.
radarek
September 24, 2009, 8:16pm
6
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