• 締切済み

Rubyのcloneメソッドの使い方を教えてください。

Rubyのcloneメソッドの使い方を教えてください。 str=”tora" str2 = str.clone str= "usagi" str2 #=>"usagi" だと思っていたのですが、違うようです。 よろしくお願いいたします。

  • Ruby
  • 回答数3
  • ありがとう数18

みんなの回答

  • notnot
  • ベストアンサー率47% (4844/10253)
回答No.3

ケース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)
回答No.2

質問のようなことをやるのであれば 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)
回答No.1

使い方ですか? 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"にはならないのです。

関連するQ&A

  • Ruby 自作メソッドのブロック付きメソッドについ

    いつも、ご教授ありがとうございます。 Ruby でメソッドを自作してそのメソッドにブロックを持たせる場合 ブロック内で返り値を返すためにはどうしたらいいのでしょうか? たとえば以下のような自作メソッドがあるとすると def blocktest(str) if (block_given?) yield str else print "メソッドにブロックが与えられていない"; end end begin #自作したメソッドにブロックを与えた場合 res = blocktest("ブロック付きメソッドのテスト") {|value| print value; print "<br/>" print "メソッドに与えられた引数をprintしています" return "ブロックで返り値" } print res; print "<hr />" #ブロックを与えない場合 blocktest("ブロック付きメソッドのテスト"); rescue => ex print ex.message end 上記のようにブロック内で返り値 を指定して変数resのその返り値を返したい場合 どうしたらいいのでしょうか? 一応、ブロック内でreturnで値を与えてはいますが、例外が発生します。 よろしくお願いしまう。

    • ベストアンサー
    • Ruby
  • Ruby sortメソッド

    RubyのEnemuratableモジュール内で定義されているメソッドのひとつsort メソッドの使い方が良くわかりません。 ブロックや<=>演算子を用いて何か分かりやすい例はありますでしょうか?

  • Rubyのtimesメソッドから抜けたい

    Rubyの初心者です。 timesメソッドの中にif文を入れて,もし条件を満たしていれば timesメソッドから抜けたいのですが,どうすればいいのでしょうか。 if文の中でbreakしてもtimesメソッドからは抜けられなかったので質問しました。 どうかよろしくお願いします。

  • Rubyに、クラスメソッドというものがありますが、どういう時に使うので

    Rubyに、クラスメソッドというものがありますが、どういう時に使うのでしょうか?初歩的な質問で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • Javaでメソッドの引数にメソッド

    以下のようにメソッドの引数にメソッドを渡したいです。 static void methodA(methodB, str) { methodB(str); } static void methodB(str) { System.out.println(str); } つまりメソッドAにメソッド名「methodB」と文字列「str」を渡して、間接的にメソッドBを実行させたいということです。 getMethodやinvokeを使うのかなとは思ったのですが、よく理解できませんでした。 上記のようなことは可能でしょうか?

    • ベストアンサー
    • Java
  • rubyのメソッドについて

    Ruby初心者(オブジェクト指向はわかります)なのですが、メソッドについてわからないことがあって質問させていただきました。 Net::SMTP.start('smtp.example.com', 25) {|smtp| smtp.send_message(<<-EndOfMail, 'from@example.com', 'to@example.net') From: Your Name <from@example.com> To: Dest Address <to@example.net> Subject: test mail Date: Sat, 23 Jun 2001 16:26:43 +0900 Message-Id: <unique.message.id.string@yourhost.example.com> This is a test mail. EndOfMail } このプログラムの意味を理解しようとしているのですが、どうもわかりません。 私の現在の認識を説明させていただくと、 1)NetクラスのインナークラスであるSMTPクラスのstartメソッドを呼び出している。 2)('smtp.example.com', 25)これはstartメソッドの引数である。 3)|smtp|よくわからない。このstartメソッドの戻り値?startメソッドの中なのに? 4)From: Your Name <from@example.com> ここもよくわからない。なぜ急に変数にも代入しない 文字列を書いたのか? 以上が私の現在の認識と疑問点です。 疑問点はもちろん、認識している点も誤って認識している点があればご指摘いただけると幸いです。

    • ベストアンサー
    • Ruby
  • VectorにClone()メソッドを追加する方法

    Vectorクラスを継承または何かのインタフェースを実装して、Clone()メソッドを追加したMyVecotorを作成したのですがどうしたらいいですか? MyVector mv = new MyVector(); MyVecotr mv2; mv2 = mv.Clone(); //すべての要素をCloneする mv2 = mv.Clone(4,10); //要素4~10までの要素をCloneする 動きとしてはこんな感じです。

  • cloneメソッドはシャローコピー?

    質問させてください。 ネットを見ると、cloneメソッドはシャローコピーをするものだと認識できます。 しかし、以下のコードを実行すると、配列cnum[0]とnum[0]の値が異なる結果になり、ディープコピーを行っているように見えます。 public class Hairetu { public static void main(String[] args) { int []num={1,2,3}; int []cnum=new int[3]; int []dnum=new int[3]; cnum=num.clone(); cnum[0]=12; for(int i=0;i<3;i++) { System.out.println(cnum[i]+" "+num[i]); } } } cloneメソッドはディープコピーなのでしょうか。 どなたか教えてください。お願いします。

    • ベストアンサー
    • Java
  • RubyのDateクラスのメソッドが見つからない

    先日よりRubyでのプログラミングを始めてみたのですが DateクラスのDate::MOTHNAMESを参照しようとしたところ undefined method `MOTHNAMES' for Date:Class (NoMethodError) と返ってきてしまいました。 ほかにもDate::exist?メソッドもためしてみましたが、同じ様なコメントが 返ってきました。 undefined method `exist?' for Date:Class (NoMethodError) なお、 Date.newなどはつかえています どういった問題でどのように解決すれば良いのか、ご教示願えればと思います。 バージョンは ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0] で、Mac OSX Lionで動かしています。

  • Rubyのprettyprintについて

    Ruby2.1.3を使って楽しいRuby第4版を学習しているんですが ppメソッドでp.56のListの例題のとおりv = [{key00:"「楽しいRuby第4版」", key01:"「Rubyレシピブック」", key03:"「rails3レシピブック」"}]を出力しても、適度に改行してくれません。 出力結果はpメソッドと同じく横に羅列されてでてきます。 何がいけないんでしょうか?

    • ベストアンサー
    • Ruby