そうそう、テスト書くのをサボってたよ ほか
そうそう、テスト書くのサボってたよ
この前の合宿でもちゃんと書いてなかったし…というわけで久々にちゃんと書いてみたところ、
どんなに時間をかけてもなかなかかけなかったコードが1割ほどの時間でかけてしまいました。
すでに書いたコードをコピペして再利用したのもありますが、printデバッグよりもはるかに頭がすっきりしますね。
深いコピーと浅いコピー
参照というシステム*1がある言語を書いているときにうっかりしてるとよくハマるやつです。変数の値をコピーしようとするとき、
- 値の実体ではなく値の参照だけをコピーするのが浅い(shallow)コピー
- 値の実体そのものもコピーするのが深い(deep)コピー
です。たいていは深いコピーをしたつもりが浅いコピーでもにょることのほうが多いと思います。この場合はどこかで値を変えるとその値を参照している変数の値が全て変わってしまい、思ったように動いてくれません。逆の場合は、たとえばスワップしたつもりができてない、というのが考えられると思います。
ちなみに私は、今日まじまじとドキュメントを見るまで、RubyのObject#dupは深いコピーだと思ってました。しかし...
clone や dup はオブジェクト自身を複製するだけで、オブジェクトの指し ている先(たとえば配列の要素など)までは複製しません。これを浅いコピー(shallow copy)といいます。
instance method Object#clone
(; ・`д・´) ナ、ナンダッテー !! (`・д´・ (`・д´・ ;)
今後は気をつけましょう。ちなみに深いコピーをしたい場合はこちら↓
深い(deep)コピーが必要な場合には、 Marshalモジュールを利用して
Marshal.load(Marshal.dump(obj))このように複製を作成する方法があります。ただしMarshal出来ないオブジェクトが 含まれている場合には使えません。
instance method Object#clone
*1:ほとんどの言語がそうなのでは…