たけ(tk)です 言葉足らずにすみませんでした。 > 式1 が未定義もしくは偽のとき 式1 に 式2 の評価結果を代入し > その値を全体の評価値とする。 > 式1 が真のとき,その評価結果を全体の評価値とする。 自己代入演算子は 式1 が未定義かどうかで区別しないということです。 > 式1 が偽のとき 式1 に 式2 の評価結果を代入し > その値を全体の評価値とする。 > 式1 が真のとき,その評価結果を全体の評価値とする。 > 式1 が未定義の変数や定数、ハッシュなど場合には・・・と続く・・・ という感じでしょう。 --- ローカル変数でエラーにならない理由と グローバル変数やインスタンス変数やハッシュでエラーにならない理由とは違い ます。 グローバル変数やインスタンス変数やハッシュでエラーにならない理由は、それ らが未定義のまま参照されてもデフォルト値 nil を返すからです。 irb(main):008:0> defined? @x #=> nil ・・未定義でも irb(main):009:0> @x #=> nil ・・デフォルト値で評価される。 irb(main):010:0> @x &&= 1 #=> nil ・・デフォルト値で評価している。 irb(main):011:0> @x #=> nil irb(main):012:0> defined? @x #=> nil ・・未定義のまま irb(main):023:0> h = {} #=> {} irb(main):024:0> h #=> {} ・・h[:x]が未定義でも irb(main):025:0> h[:x] #=> nil ・・デフォルト値で評価される。 irb(main):026:0> h[:x] &&= 1 #=> nil ・・デフォルト値で評価している。 irb(main):027:0> h[:x] #=> nil irb(main):028:0> h #=> {} ・・h[:x]は未定義のまま それに対して、 ローカル変数でエラーにならない理由は、ローカル変数が代入演算子の左辺に来 たときには nil で初期化されるからです。 irb(main):002:0> defined? x #=> nil irb(main):003:0> x # NameError: undefined local variable or method irb(main):005:0> x &&= 1 #=> nil ・・代入演算子の左辺に来たので irb(main):006:0> x #=> nil ・・nil で初期化されている。 irb(main):007:0> defined? x #=> "local-variable" 定数でエラーになるのは、nil で初期化されることもなく、デフォルト値も返さ ないので、参照の段階でエラーになるからです。 irb(main):013:0> defined? X #=> nil irb(main):014:0> X # NameError: uninitialized constant X irb(main):015:0> X &&= 1 # NameError: uninitialized constant X irb(main):016:0> X # NameError: uninitialized constant X irb(main):017:0> defined? X #=> nil