||=での初期化

あんまり初歩的な話を書くのも恥ずかしいのですが。
なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪

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

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、 もぎゃが 2007年9月14日 20:18に書いたブログ記事です。

ひとつ前のブログ記事は「 携帯電話専門TV局Qlick.TV 」です。

次のブログ記事は「 [読書]ボナンザVS勝負脳 」です。

最近のコンテンツは インデックスページ で見られます。過去に書かれたものは アーカイブのページ で見られます。

Powered by
Movable Type