配列

配列で注意しないといけないなっと思ったことがあったのでまとめ。

array[n] = itemでarray[n]の要素をitemに変更できて、
この場合、まだ定義されていないインデックスへの置き換えは、そのまま行われます。

例えば、

alpha = %w(a b c d e f)
alpha[6] = "g"
p alpha #=> ["a", "b", "c", "d", "e", "f", "g"]

この時、連続しないインデックスへの置き換えを行ったとき、間にはnilが入ります。

alpha = %w(a b c d e f)
alpha[7] = "h"
p alpha #=> ["a", "b", "c", "d", "e", "f", nil, "h"]

これは参照した時も同じで、まだ定義されていないインデックスを参照した時も、nilを返します。

alpha = %w(a b c d e f)
p alpha #=> nil

ここからが本題です。

array[n..m],array[n...m]やarray[n,len]などのを使って、複数を置き換えるときは注意が必要です。

alpha = %w(a b c d e f)
alpha[2..4] = ["C","D"]
p alpha #=> ["a", "b", "C", "D", "f"]

alpha = %w(a b c d e f)
alpha[2,3] = ["C","D"]
p alpha #=> ["a", "b", "C", "D", "f"]
alpha = %w(a b c d e f)
alpha[2..4] = ["C","D","E","F"]
p alpha #=> ["a", "b", "C", "D", "E", "F", "f"]

alpha = %w(a b c d e f)
alpha [2,3] = ["C","D","E","F"]
p alpha #=> ["a", "b", "C", "D", "E", "F", "f"]

このように、置き換えるはずの要素数より少なくすると、残りの置き換えられるはずだった要素がなくなります。

逆に、置き換えるはずの要素数より多くすると、その先の要素が置き換えられることはないです。

後者は、array[n,0] = itemを使って、nの要素の前に挿入していくことにも使われてますね。

前者の場合、置き換えられずに終わると思ったので、自分の予想と違ったので、注意して使おうと思います。

そういう状況になることがあるのかわかりませんが。