- 締切済み
Rubyのcloneメソッドの使い方を教えてください。
Rubyのcloneメソッドの使い方を教えてください。 str=”tora" str2 = str.clone str= "usagi" str2 #=>"usagi" だと思っていたのですが、違うようです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
ケース1: 1) str = "tora" # "tora"という内容のStringオブジェクトを生成してstrがそれを指すようにする 2) str2 = str # 1)で作ったオブジェクトをstr2も指すようにする 3) str = "usagi" # 新たに"usagi"という内容のStringオブジェクトを生成してstrがそれを指すようにする 4) p str2 #=> "tora" str2は1)で作ったオブジェクトを指したまま ケース2: 1) str = "tora" # "tora"という内容のStringオブジェクトを生成してstrがそれを指すようにする 2) str2 = str.clone # 新たにStringオブジェクトを生成してstr2がそれを指すようにする。オブジェクトの内容はstrが指している1)のオブジェクト内容のコピー 3) str = "usagi" # 新たに"usagi"という内容のStringオブジェクトを生成してstrがそれを指すようにする 4) p str2 #=> "tora" str2は2)で作ったオブジェクトを指したまま ケース3: 1) str = "tora" # "tora"という内容のStringオブジェクトを生成してstrがそれを指すようにする 2) str2 = str # 1)で作ったオブジェクトをstr2も指すようにする 3) str.replace("usagi") # 1)で作った"tora"オブジェクトの中身を"usagi"に書き換える 4) p str2 #=> "usagi" str2は1)で作ったオブジェクトを指したままだが、その中身は3)で"usagi"に書き換えられた それぞれの代入の後で、p str.object_id してみれば、同じオブジェクトを指しているのか、違うオブジェクトを指しているのかがわかると思います。 str.replace("usagi") は 他の方が書いていた str[0..-1]="usagi" と同じ効果を持ちます。C言語だと、strcpy() 相当。
- t-okura
- ベストアンサー率75% (253/335)
質問のようなことをやるのであれば str=”tora" str2 = str str[0..-1]= "usagi" str2 #=>"usagi" でしょうか。 str = "usagi" だと、str 文字列オブジェクトの中身を変えるのではなく "usagi" 文字列オブジェクトの場所を str に代入することになると 思います。 clone を使うと str と str2 は違う文字列オブジェクトを指しているので str=”tora" str2 = str.clone str[0..-1]= "usagi" str2 #=>"tora" となります。
- sakusaker7
- ベストアンサー率62% (800/1280)
使い方ですか? irb(main):001:0> str1='tora' => "tora" irb(main):002:0> str2=str1 => "tora" irb(main):003:0> str2 => "tora" irb(main):004:0> str2.upcase! => "TORA" irb(main):005:0> str2 => "TORA" irb(main):006:0> str1 => "TORA" irb(main):007:0> str1='tora' => "tora" irb(main):008:0> str2=str1.clone => "tora" irb(main):009:0> str2 => "tora" irb(main):010:0> str2.upcase! => "TORA" irb(main):011:0> str2 => "TORA" irb(main):012:0> str1 => "tora" irb(main):013:0> str1='tora' str2=str1 としたときは同じ実態を共有していて、str2で書き換えを行うと str1からも同じ結果に見えます。 一方 str2=str1.clone とした場合は内容は同じだけど別の場所に 実態が作られるので影響しません。 str=”tora" str2 = str.clone str= "usagi" str2 #=>"usagi" だと、コピーしたものをstr2 で指し示すようにしていますが str="usagi" では str の指すものを変えているだけなので、str2 は str.clone で作った場所を指し続けていますから、"usagi"にはならないのです。