From: "5.5" <5.5@...> Date: 2015-01-17T14:12:58+09:00 Subject: [ruby-list:50066] Re: x ||= 1 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