ArrayとHashの非対称性
同じところ
両者とも、[]メソッドによる存在しないキーへの参照に対しては、nilを値として返す。
[1][1] #=> nil {a: 1}[:b] #=> nil
またそのようなケースが望ましくなく、存在しないキーを渡した時に例外を上げたい場合には、fetchメソッドが使える。
[1].fetch(1) #=> (IndexError) {a: 1}.fetch(:b) #=> (KeyError)
違うところ
Hashならば生成時に、[]メソッドによる存在しないキーへの参照に対し、nil以外の値をデフォルト値として指定することができる。
Hash.new(:void)[:b] #=> :void
一方、Arrayはそれが単純にできない。nil以外の値を返したければ、fetchメソッドの第二引数にそれを毎回指定しなければならない。
{a: 1}.fetch(:b, :void) #=> :void
fetchメソッドに関しては、Hashも同様に第二引数を指定可能だ。Hash.newでデフォルト値を指定しても、fetchに第二引数を設定すれば、後者が優先される。
Hash.new(:void).fetch(:b, :anothervoid) #=> :anothervoid
思うところ
何でArrayでデフォルト値の設定ができないのだろう?
Hash同様、fetchの第二引数を指定する方法はあるが、毎回指定するのでは「デフォルト値」= 「怠惰なケース」のとしての旨味が薄くなる。要は、すっきりしない。
具体的なケース挙げて、Array.newでデフォルト値を指定できるよう、仕様変更を引き出す人を所望します。