質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

431閲覧

rubyで代入したら、右辺の変数が変わる

pinecone

総合スコア18

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/07/09 13:38

ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]を
VSCode上で動かしています。

以下のコードを実行しました。
str="aaa"
str2=str
str2<<"2"
p str

イミディエイトウィンドウには
"aaa2"
と出ます。

普通、右辺の内容が左辺に代入された後に、
左辺が変わっても、元の右辺には影響しないと思うのですが、
何か変数同士が関連付けされるようなことがあるのでしょうか。

なんらかの初歩的な勘違いが原因と思われますが、
ご教授いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

rubyは値は全てオブジェクトとして扱っており、代入演算子はオブジェクトの参照を代入する動きとなります。
なので、オブジェクトの参照ではなくオブジェクトをコピーしたい場合は、オブジェクトを複製(clone,dup)し、その複製したオブジェクトの参照を代入する必要があります

ちなみに Object#object_id があり、これで同じオブジェクトを指しているか確認することができます。

https://wandbox.org/permlink/xrJo2l3T4sjbzJFv

投稿2021/07/09 13:55

fukasawah

総合スコア147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinecone

2021/07/09 14:42

なんとなく理解できました。 ありがとうございます。 参照しそうなときは複製するか、挙動をObject_idで確認することにします。
pinecone

2021/07/09 14:43

理解できました。 参照になりそうなときは、複製するか、Object_idで挙動を確認することにします。 ありがとうございました。
guest

0

ベストアンサー

右辺の内容が左辺に代入された後に、

Rubyの場合、代入されるのは「内容」ではなくオブジェクトそのものです。

代入後にオブジェクトを破壊的に変更すれば、同じオブジェクトである両者から結果が見えます。

投稿2021/07/09 13:47

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/07/09 13:55

なお、「str2+="2"」とした場合は、新しい文字列オブジェクトが作られてstr2に代入されるので、strから見える元のオブジェクトは変化しません。
pinecone

2021/07/09 14:40

str="aaa" str2=""<<str str2<<"2" p str 教えていただいた内容を参考に少し改変してみたら、 "aaa"となり、意図した挙動となりました。 分かりやすいご説明ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問