[質問]clone について
rizo
rizo
ATOMRSS
  • コード求むID: 334
  • 登録日時:  2008/10/13 05:32
  • 最終更新日時: 2008/10/17 15:44
  • アクセス数: 361
  • タグ: 
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

java, php, ruby どれでもいいんですが、clone メソッドというのは、どういったケースに使用することがありますか?
いまいち使い方がイメージできません。
「こういったときに使ったよ」
「こんなときに便利でしょ」
と言ったアドバイスがいただけたらと思います。

どうぞよろしくお願いします。

コメント

Javaについてですが、あまりcloneメソッドを利用するということはありませんね~。(親クラスが実装しているとか、開発の都合上利用する場合はあるかもしれませんが。)

他の言語では分からないですが、Collectionインターフェースを実装しているクラスみたいに、コピーコンストラクタを使うことが多い気がします。

  • GoodJob
  • 0

  • mmike
  • 2:mmike
  • 2008/10/14 17:06

Javaに限ってになりますが、通信用のパラメータを独立したBeanにして委譲させた際、getterで本物をそのまま返すと設定値が換わってしまうので、clone値を返却するということをしたことがあります。


  • GoodJob
  • 0

  • rizo
  • 3:rizo
  • 2008/10/17 05:07

tetsuhon様、mmike様
アドバイスありがとうございます。
む〜ん、難しいですね。

自分でも少し調べてみました。
「オブジェクトのコピーを作るにはどうするか?」
http://ray.sakura.ne.jp/tips/copy.html
>Prototype パターンを使いたい時などです。
ほうほう、Prototypeパターンとな・・・

「Prototype パターン」
http://www.techscore.com/tech/DesignPattern/Prototype.html

あ、なんか掴めそう、うーんまだ無理

ということで、引き続き理解ができるように調べてみたいと思います。

  • GoodJob
  • 0

  • rizo
  • 4:rizo
  • 2008/10/17 06:41

いろいろ理解不足なんですが・・・
ruby で試してみました。

まずはirbを実行
userに名前を設定して、user2 に代入、user2に新しい名前を設定

-- 例1
>> user "tanaka"
=> "tanaka"
>> user2 user
=> "tanaka"
>> user
=> "tanaka"
>> user2
=> "tanaka"
>> user2 "yamada"
=> "yamada"
>> user == user2
=> false
>> user
=> "tanaka"
>> user2
=> "yamada"

user は "tanaka" のまま、user2 は "yamada" に変更になりました。
自分の中では当たり前じゃん!っと言った感じです。

で、次
同じように、userに名前を設定して、user2 に代入、user2に新しい名前を設定
ただし今回はハッシュを使いました。

-- 例2
>> user {"name" => "tanaka"}
=> {"name"=>"tanaka"}
>> user2 user
=> {"name"=>"tanaka"}
>> user
=> {"name"=>"tanaka"}
>> user2
=> {"name"=>"tanaka"}
>> user2["name"] "yamada"
=> "yamada"
>> user == user2
=> true
>> user
=> {"name"=>"yamada"}
>> user2
=> {"name"=>"yamada"}

user2 の名前を変更すると、user の名前も変更になっちゃいました。
で上記の、「user2 user」 の部分を 「user2 user.clone」 とすると
user2 の名前を変更しても、user の名前は変更されないわけです。

自分の中では例1で user の名前が変更されなかったので、例2でも当然 user の名前は変更されないだろうと思っていたのですが・・・
clone は解決したとして、この辺り説明できる方いらっしゃいますか?

いにしえからやっていらっしゃる方なんかは、
「そんなの当たり前じゃん!」と言うかもしれませんが・・・
どうぞよろしくお願いします。

  • GoodJob
  • 0

  • rizo
  • 5:rizo
  • 2008/10/17 07:22

なんか立て続けなんですが、さらに試してみました。

>> user "tanaka"
=> "tanaka"
>> user2 user
=> "tanaka"
>> user
=> "tanaka"
>> user2
=> "tanaka"
>> user2 "yamada"
=> "yamada"
>> user[0]
=> 116
>> user2[0]
=> 121
>> user[0] 121
=> 121
>> user
=> "yanaka"

user が "yanaka" になった。
"t" が "y" に書き変わりました。
ポインタってやつですか?
LLしか知らないのでこの辺り気にしたことないんですが、
user[0] のメモリアドレスを示す場所「116」に「"t"」が格納されていて、
user[0] のメモリアドレスを「"y"」が格納されている「121」に変更すると、
user は "yanaka" になるというわけですね。

で前の投稿の例2の場合は、
user も user2 も同じメモリアドレス上の["name"](この辺りの言葉の選択が正しいかわかりませんが・・・)を参照しているので、user2["name"] を変更すると user["name"]も変更になると。

で user2 user.clone した場合には、user2 の["name"]に別のメモリアドレスが割り振られるということになるということでしょうか?


  • GoodJob
  • 0

  • ゲスト
  • 6:ゲスト
  • 2008/10/17 15:44

4の例2について。

user2 user
というのは、「userが指しているオブジェクトを、user2も指すようにする」ということで、両方同じオブジェクトを指しています。
その上で、
user2["name"] "yamada"
と、「user2の指しているオブジェクトをこのように変える」だと、「あ、それってuserも指してたよね」なので。

例1だと、
user "tanaka"  「userが"tanaka"を指すようにする」
user2 user     「userが指しているオブジェクトを、user2も指すようにする」
user2 "yamada" 「user2が"yamada"を指すようにする」
と、最終的に両者は別の物を指しています。

  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント