Rubyのレキシカル変数むずかしい

同じシンボルの参照でも、代入(宣言)前後で参照しているものがまったく違うものになるのがPerlと違って難しい。

class Base
    def initialize
        self.foo = "init"
    end

    def foo=(value)
        @foo = "<#{value}>"
    end
    def foo
        @foo
    end
end

class Derived < Base
    def f # selfがないとメソッド呼び出しと変数参照は同じに見える
        puts "In f()"
        p foo        # Base#foo()
        p foo = 2 # レキシカル変数の宣言
        p foo        # fooはレキシカル変数
    end

    def g # self付きだと常にメソッド
        puts "In g()"
        p self.foo
        p self.foo = 2
        p self.foo
    end
end

d = Derived.new
d.f
d.g

出力:

In f()
"<init>"
2
2
In g()
"<init>"
2
"<2>"