Ruby の private セッターメソッドは self. をつけても呼び出すことが出来る

さて、 Ruby の private メソッドは通常レシーバを付けて呼び出す事が出来ません。

class User
    private
    def age
        42
    end
end

user = User.new

# NG : private method `age' called for #<User:0x0000562111c42218> (NoMethodError)
p user.age

これは self. を付けても同じです。

class User
    def output
        # OK
        p age

        # NG : private method `age' called for #<User:0x00005606cceabb80> (NoMethodError)
        p self.age
    end

    private
    def age
        42
    end
end

user = User.new
user.output

セッターメソッドの場合は self. を付けてもメソッドを呼び出すことが出来る

例外的に #age= のようなセッターメソッドの場合は private メソッドでも self. を付けて呼び出すことが出来ます。

class User
    def set
        # これだとローカル変数に対して代入される
        age = 42

        # OK : private メソッドだけど self. を付けて呼び出せる
        self.age = 42
    end

    private
    def age= value
        @age
    end
end

user = User.new
user.set

代入式の場合、レシーバを付けないとローカル変数が定義されてしまうのでこれだけ例外的に呼び出す事が出来るようになっているんですかね。