||=での初期化
あんまり初歩的な話を書くのも恥ずかしいのですが。
なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪
foo ||= 0 ってなに?そんな演算子はないよね?
...そうすると、これがパーサー(仮想マシン?Rubyの中の人^^;)からどう見えるかというと、たぶん、まず||が評価される。
fooは未定義なので、ここでのfooはfalse。orだから、falseだったら次を評価するはずで。
つぎって、"=0"。 orで評価している途中ですが、そこに0を代入。どこに代入???
と思ってリファレンスマニュアルをみていたら、書いてあった。
Rubyリファレンスマニュアル - 演算子式
ああ。なるほど。
つまり、foo ||= 0は
おお。ナルホド。勉強になりました。
なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪
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となって、実質何もしない。結果として変数の初期化ができる、と。
おお。ナルホド。勉強になりました。
カテゴリ:
技術メモ
トラックバック(0)
このブログ記事を参照しているブログ一覧: ||=での初期化
このブログ記事に対するトラックバックURL: http://mogya.com/mt/mt-tb.cgi/352
コメントする