Lus tellers
Geplaatst door Michiel de Mare di, 29 aug 2006 03:54:00 GMT
Ik ben op een vreemde eigenschap in Ruby gestuit terwijl ik een loop counter probeerde te schrijven die niet geïnitialiseerd hoefde te worden.
i = 1 + (i || -1)
Het idee was dat de eerste keer de counter op 1 + -1 (==0) wordt gezet, en dat hij daarna met één verhoogd wordt. Maar toen bedacht ik dat dit niet werkt omdat de rechterkant eerst geëvalueerd wordt, en daarin i ongedefineerd is. Toch bleek dit te werken! bar
geeft een foutmelding, maar bar = bar
is wel geldig!
Vreemd, nietwaar?
Uiteindelijk bleek deze constructie niet te werken omdat hij in een block stond, zodat alle lokale variabelen uit scope raken aan het eind van een block.
Zie punt 4.3 van http://dev.rubycentral.com/faq/rubyfaq-4.html
Aha! Dat was ik al weer helemaal vergeten.
Wat ik eigenlijk wilde doen, is zoiets:
list.with_index.map {|obj, index| ... }
Dat kan zo:
list.zip((0…list.length).to_a).map{ |o, i| puts ”#{i}: #{o}”}