Twee Procs
Geplaatst door Michiel de Mare do, 31 aug 2006 13:22:00 GMT
Eén van de leuke uitbreidingen van Rails op Ruby is de to_proc
methode in de Symbol
class. Op een plek waar Ruby een Proc
verwacht (na een ampersand bijvoorbeeld) maar een ander object tegenkomt, roept Ruby de to_proc
methode van dat object aan, die, indien aanwezig, een proc teruggeeft die gebruikt kan worden. Voorbeeld: ['hallo','lezertjes'].map &:upcase
geeft ['HALLO','LEZERTJES']
.
Ook argumenten worden ondersteund. Als je map
bijvoorbeeld aanroept op een Hash
worden er twee argumenten (key en value) meegegeven. Om de key door de value te delen doe je dit: {33 => 11,39 => 3}.map &:div
, wat geeft [3,13]
.
Er is alleen één probleem. Ruby maakt geen onderscheid tussen arrays en meerdere argumenten. De to_proc
implementatie gaat uit van meerdere argumenten; probeer je een array mee te geven dan gaat het mis: [[1,2,3],[4,5,6],[7,8,9]].map &:first
Je verwacht: [1,4,7]
, maar je krijgt NoMethodError: undefined method `first' for 1:Fixnum
Ruby 2 gaat als het goed is onderscheid maken tussen arrays en meerdere argumenten. Tot die tijd moeten we de blocks maar even uitschrijven…
Update:
Symbol is natuurlijk niet de enige class die hiervoor te misbruiken is. Hier een variant voor de Regexp:class Regexp; def to_proc; Proc.new {|a| a.send source.to_sym };end; end [[1,2],[3,4]].map &/first/