あんまり初歩的な話を書くのも恥ずかしいのですが。
なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪
while true foo ||= 0; foo += 1; puts foo; break if foo > 99 end
foo ||= 0 ってなに?そんな演算子はないよね?
…そうすると、これがパーサー(仮想マシン?Rubyの中の人^^;)からどう見えるかというと、たぶん、まず||が評価される。
fooは未定義なので、ここでのfooはfalse。orだから、falseだったら次を評価するはずで。
つぎって、”=0″。 orで評価している途中ですが、そこに0を代入。どこに代入???
と思ってリファレンスマニュアルをみていたら、書いてあった。
Rubyリファレンスマニュアル – 演算子式
foo += 12 # foo = foo + 12 a ||= 1 # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。
ああ。なるほど。
つまり、foo ||= 0は
foo = foo || 0
こう評価されて、fooが未定義の場合、評価したらfalseだから、後ろが評価された0をfooに代入する。次にループで回ってきたときはfooが定義されているから、foo=fooとなって、実質何もしない。結果として変数の初期化ができる、と。
おお。ナルホド。勉強になりました。