Rubyの[]=演算子オーバーロード

Stringの部分文字列を返す[,]演算子は式の左辺におけます。

s = "abcde"
s[1,3] = "XXX"
puts s
# => "aXXXe"

これってなんか違和感ありますよね。s[1,3]は何を返してるんだろうと。


こういった書式、s[1,3]が返すオブジェクトに"XXX"を代入する、という感覚では理解できません。
これはs[1,3]="XXX"でひとまとまり、つまり1,3,"XXX"を引数とするメソッド呼び出しだと考える必要があります。
実際に自分で定義してみると一目瞭然です。

#!/usr/bin/ruby

class MyString
  def []=(index1, index2, r_value)
    @str = [index1, index2, r_value].join(", ")
  end

  def to_s
    @str
  end
end

s = MyString.new
puts s[1,3] = "XXX"
puts s
$ ruby mystr.rb 
ABC
1, 3, XXX


ってまぁC++の=演算子オーバーロードも同じようなものなので、Rubyが変わってるというわけではないですが。