Ruby 2.7 の変更点 - self でのプライベートメソッド呼び出し

Ruby 2.7 アドベントカレンダーの8日目の記事です。

qiita.com

self でのプライベートメソッド呼び出し

プライベートメソッドは、obj.hoge の形式で呼び出そうとしたら普通はエラーになるのですが、self.hoge の場合はエラーにならなくなりました。

class A
  def foo
    self.hoge
    # 2.6 では private method `hoge' called for #<A:0x000055f92ca59738> (NoMethodError)
  end

  private

  def hoge
  end
end

A.new.foo

なお、次のように self を一旦変数に代入してから使用した場合は今までと同じエラーになります。

obj = self
obj.hoge
#=> private method `hoge' called for #<A:0x000055c8c3ab7c78> (NoMethodError)

元々、= で終わるメソッド呼び出しは self.hoge= の形式でもエラーになってませんでした。 というより、self をつけずに hoge= と記述すると hoge 変数への代入になってしまって、hoge= メソッドは呼ばれません。

class A
  def foo
    hoge = 123       # hoge 変数への代入
    self.hoge = 123  # hoge= メソッドの呼び出し
  end

  private

  def hoge=(n)
  end

  def hoge
  end
end

A.new.foo

そのために self.hoge= の形式で記述できるようになっていたのですが、self.hoge がエラーになるのは非対称だということで、合わせることになったみたいです。