5.5 です。

On 15/01/16 14:21, take_tk wrote:
> たけ(tk)です
> 
>>    式1 が未定義もしくは偽のとき 式1 に 式2 の評価結果を代入し
>>  その値を全体の評価値とする。
>>  式1 が真のとき,その評価結果を全体の評価値とする。
>>
>> ということでよろしいでしょうか?
> 
> 式1が定数の場合には、違います。

あ,そうですね。

||= の一般的な場合を考えていたつもりでいつのまにかローカル変数
的な識別子の場合だけを考えてしまっていました。

> 思いがけない発見。
> 
> irb(main):028:0> y      #=> NameError: undefined local variable ...
> irb(main):029:0> y = y  #=> nil ← ★!!!
> irb(main):030:0> y      #=> nil

こうなるのは,y = y から構文木を作るときに,識別子 y のあとに
= が付いているのを見て,y がローカル変数であると知るんですね。
それゆえ,

  s(:lasgn, :y, s(:lvar, :y))

という構文木を作る。
これはローカル変数 y の値をローカル変数 y に代入するということ
ですよね。

で,実行する段になると,まず y を評価するんだけど,一度も代入
されてないローカル変数の値は nil なので,そいつを y に代入する
ことになる,と。


-- 
5.5 / moji.gr.jp