よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

March 02, 2003 [おもひで]

[Ruby] オブジェクトのコピー

久しぶりにハマったのでメモしておこう。

1: h = Hash["test", "a"]
2: ret = h["test"]
3: ret << "b"
4: p ret  #=> "ab"
5:
6: p h["test"]  #=> "ab"

オレが期待していたのは、6行で"a"が返ってくることだったんだけど、上に書いてあるとおり、実際は"ab"が返る。

これは2行目のretが指しているのがh["test"]のポインタそのもので、3行目でh["test"]の値自身にconcat(<<)しちゃうから、結果として、6では"ab"になるということだ。

回避策としては以下の2つかな。

  • 2行目でret = h["test"].clone(or dup)としてretにはh["test"]内のデータのコピーを作ってそれを使う
  • 3行目で破壊的なメソッド(concat)ではなくコピーを作るメソッド(+=)を使う

上記例だと簡単に問題箇所がわかるけど、ちょっと複雑なコードで1度Hashから取り出した情報を(コピーするの忘れて)使い回し続けるとハマりそう、ってかそれでハマったんだけどね〜。

#そういうのオレだけ?(^^;)

[tDiary] Wikiスタイル

まだ慣れないなぁ(T_T)。段落内で#p01とかつけるのってどうすれば良いのだろう。

[Ruby] 久しぶりにハマったと書いたけど

実はRubyでコード書くこと自体が久しぶりなのかも(^^;)。

[Ruby] 八声のフーガ, Simon Cozens

ruby-talkでSimon Cozensって人を見るたびにサイモン&ガーファンクルと昔1曲だけ有名になった(2曲目もか?)カズンズっていう二人組のミュージシャンを密かに思い出しては含み笑いをしてしまうのだが(恐い)、なかなかおもしろいことを書いていた。

議論好きの英語圏の人はああいう話が好きなのかと思ってたのだけど、うんざりしている人もいるのね〜。

っていうかそれを小粋に訳す方(SugHimsiさん?)もさすがだ。

ちと話は変わるんだけど、最近ますます英語のドキュメント不足を嘆く声が挙がってきてる割には自分で訳そう(あるいは1から作ろう)って人がそれほど多くない気がする。まぁ、日本語読めなきゃできないっつーのもわかるんだけどさ。

#これを機会に日本語話せる人が増えたらおもしろいんだけどなぁ。


編集