Rubyのローカル変数とメソッド呼び出し

Rubyではメソッド呼び出し時のカッコを省略できる。
またx=というメソッドをx=3のような形で呼べたりする。
このような特徴により、コードが簡潔になり、見やすくなるが、意味的な曖昧性が生じてしまう。
曖昧性については次のようなルールを頭に入れておけばいい。
(ここではxというローカル変数、メソッドx=というメソッドを念頭においている。)

ローカル変数の参照とメソッド呼び出しについては

  • xというローカル変数が初期されていれば、それ以降、(右辺値としての)xはローカル変数の参照になる。初期化されていなければ、xはメソッド呼び出し。
  • x()と明示的にカッコを付けることによりメソッドxの呼び出しになる。

ローカル変数への代入とメソッド呼び出しについては

  • self.xと明示的にselfを付けない限りローカル変数への代入になる。

下に例を示す。

class MyClass
  def initialize(_x)
    @x = _x
  end

  def hoge0
    p x             # メソッド`x`の呼び出し
    x = 0 if false  # `x`に代入はされないが`x`はnilに初期化される
    p x             # ローカル変数の参照
    x = 2           # ローカル変数への代入
    self.x = 3      # メソッド`x=`の呼び出し
    p x()           # メソッド`x`の呼び出し
  end

  def hoge1(x=1)
    p x             # ローカル変数の参照       <- さっきと違う
    x = 0 if false  # `x`に代入はされない
    p x             # ローカル変数の参照
    x = 2           # ローカル変数への代入
    self.x = 3      # メソッド`x=`の呼び出し
    p x()           # メソッド`x`の呼び出し
  end

  def x
    p "getter"
    @x
  end

  def x=(_x)
    p "setter"
    @x = _x
  end
end

o = MyClass.new(0)
o.hoge0 #=> "getter"
        #   0
        #   nil
        #   "setter"
        #   "getter"
        #   3

o.hoge1 #=> 1
        #   1
        #   "setter"
        #   "getter"
        #   3

他人のコードを読んでるとここらへんが結構紛らわしい。
公式リファレンスでは、ここらへんの事情について詳しく書いている箇所を見つけられなかったのだが、本当にないのだろうか。

参考