2013年04月27日

プログラミングの話です。

Rubyはなんか適当に代入すると参照渡しとか言うやつになるらしく、例えば
b = a
とかやった後にbを変更するとaも変わってしまうという事になっています(簡単に言うと2つの名前がついた状態になっている)。

そういうわけでaをそのままにコピーしたbを弄りたいときはa.cloneとか使って中身だけコピーというのを使うんですけど。今回はこれで謎の現象(使ってる人は当たり前?)に遭遇しました。
実際にどうなったのかは以下のとおりです。

#ここから
a = ["abc","def"]
b = a.clone
b[0].upcase!
print a
#ここまで

ちなみにupcase!はその要素(文字列)の小文字を大文字に書き換えるメソッドです。上のプログラムを実行すると
["ABC","def"]
と出力されます。cloneしたはずのaが書き換わってしまってます。配列のcloneてこういうものなんでしょうか。ちなみにaを配列ではなく文字列だとこういうことは起こりませんでした。
b[0] = b[0].upcase
としたら普通に動いたのでそういうことにしました。
というわけで配列のcloneと破壊的メソッドを合わせて使うときは注意したほうがいいようです。

おわり

(文字列 << "追加の文字列" #ってやつも破壊的メソッドなんですね。これ書いた直後にこれでハマるとか…)

(02:34)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔