Rubyに++がない理由

今日の衝撃経由、ruby-list:5323にて。
「(Rubyに++がないのは)++の動作が本質的に「変数を操作する」ものであるため」とのこと。
なるほど。

  • 変数はオブジェクトではない
  • ++は += 1 すなわち「代入操作」である
  • 代入操作はオブジェクトに対する操作ではなく、変数に対する操作である

と理解しました。ということは「代入する」というメソッドはあり得ないのですね。

class Rubyco
  def =(x)
  end
end

Rubyco.new = 12345

実行すると...

a.rb:2: parse error, unexpected '='
  def =(x)
       ^
a.rb:6: parse error, unexpected $, expecting kEND

ふむふむ。
ただし、配列の要素への代入はメソッドになりますね。これはいわばインスタンス変数への代入のようなものですからね。

class Rubyco
  def []=(i, x)
    puts "Assign '#{x}' to the #{i}th element."
  end
end

Rubyco.new[5] = "Milla Jovovich"

実行結果です♪

Assign 'Milla Jovovich' to the 5th element.

追記(課題):代入をメソッドにすると変だな、というのがよくわかるパターンは、

self = 123

という式(文)だと思います。これをもし、

self.assign(123)

あるいは、

self.value = 123

だと解釈したらどうなるだろう、というのは考える価値のある問題…かしらん。