2013/02/08

添字代入の裏側

初めてのRubyより

添字参照式が返す値は、配列が保持している「オブジェクトへの参照」です。「オブジェクトへの参照」に式を 代入するというのは意味が分かりません。

あるいは、長さ付き参照や範囲参照の式ならば「配列の一部の要素を元に新たに作成された配列」を返します。けれども、新規に作成された配列に代入したところで、元の配列が更新されるのは話がおかしいでしょう。

実は、添字代入式は添字参照式とはまったくの別物です。後者はArray#[]メソッドの呼び出しでしたが、前者はArray#[]=メソッドの呼び出しです。両者はできるだけ一貫性を保つように実装されています。けれども、本質的には異なるメソッドなので細かな挙動には違いがあります。例えば、以下のようになります。

初めてのRuby 2.1 添字代入の裏側 33ページ
a = ["a", "b"]
a[-3] #=> nil 範囲外のアクセスに対してはnil を返す
a[-3] = 1 #=> IndexError 例外を発生
こういう挙動の不一致をすぐにあげられるようになりたいなぁ。メモメモ。