ローカル変数とインスタンス変数の参照・代入

今知ったのだけど、 Ruby はこういう動きをします。

class Foo
    attr_accessor :val
    def bar
        val        # => 123
    end

    def zot
        val        # => 123
        val = 456
        val        # => 456
    end
end

foo = Foo.new
foo.val = 123
foo.bar             # => 123

foo.zot
foo.val             # => 123
  • メソッド中で最初に参照した場合は、同名のインスタンス変数があればその値が返る。
  • メソッド中で代入した後は、ローカル変数が返る。


私は、同名のインスタンス変数があれば、
すべてそちらが参照されると認識していたのですが、違いました。
間違えて教えてしまった人、すみません。

動きとしては、まあ納得の行くものかと。
Python もちょっと変なところがあったな〜。