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

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

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

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

Q&A

解決済

3回答

392閲覧

2つの変数のうち1つだけを動かしたい

kanieksuke

総合スコア33

Ruby

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

0グッド

0クリップ

投稿2022/04/16 13:04

解決したい事

配列を格納した[変数1]を定義し、[変数1]と同じ値を持つ[変数2]を定義しました。
[変数2]にだけ値を代入しようと思ったのですが、[変数1]にも同じ値が代入されてしまいました。

[変数2]だけ独自の挙動をさせる事はできないのでしょうか?

terminal

1irb(main):001:0> array1 = [1, 2, 3] 2=> [1, 2, 3] 3irb(main):002:0> array2 = array1 4=> [1, 2, 3] 5irb(main):003:0> array2 << 4 6=> [1, 2, 3, 4] 7irb(main):004:0> array1 8=> [1, 2, 3, 4] 9irb(main):005:0>

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

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

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

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

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

guest

回答3

0

1次元配列の場合は、回答のある通りclonedupを使えば解決しますが、
clone(やdup)を使えばいい」とだけ記憶すると2次元以上になった時に破綻するので、
この際、何故こうなるのかをちゃんと理解しておきましょう。
2次元の例:

Ruby

1array1 = [[1,2],[3,4],[5,6]] 2array2 = array1.clone 3array2[0] << 7 4p array1 5#=> [[1, 2, 7], [3, 4], [5, 6]]

投稿2022/04/17 00:57

otn

総合スコア84499

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

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

guest

0

次のコードと実行結果を研究してみてください。
r.rb

ruby

1array1 = [1, 2, [3, 4]] 2array2 = array1 3array3 = [1, 2, [3, 4]] 4array4 = array1.clone 5array5 = array1.dup 6 7puts("array1=#{array1}") 8puts("array2=#{array2}") 9puts("array3=#{array3}") 10puts("array4=#{array4}") 11puts("array5=#{array5}") 12 13array1[0] = 999 14array1[2][0] = 888 15puts 16puts("array1=#{array1}") 17puts("array2=#{array2}") 18puts("array3=#{array3}") 19puts("array4=#{array4}") 20puts("array5=#{array5}") 21 22array1[0] = 999 23 24array1 = ['A', 'B', 'C'] 25puts 26puts("array1=#{array1}") 27puts("array2=#{array2}") 28puts("array3=#{array3}") 29puts("array4=#{array4}") 30puts("array5=#{array5}")

実行例イメージ説明

参考情報

Rubyのオブジェクトコピーで気をつけること

投稿2022/04/16 23:33

katoy

総合スコア22324

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

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

kanieksuke

2022/04/17 15:35

画面縮小するの忘れてひたすらマウスホイールコロコロ動かしながら見比べてました…… とくに最後のarray1の挙動が謎すぎる…… 深いコピーと浅いコピーって何なんだ…… 知れば知るほど深みに嵌っていって面白いです! 参考になりました。ありがとうございます。
katoy

2022/04/17 20:57

array12 = array1.clone だけで質問の直接の対処は得られたかも知れません。 でも、その奥にある事を知っていただけたらと思い, サンプルコードを示したのです。 興味を持っていただけたなら幸いです。
guest

0

ベストアンサー

ruby

1irb(main):001:0> array1 = [1, 2, 3] 2=> [1, 2, 3] 3irb(main):002:0> array2 = array1.clone 4=> [1, 2, 3] 5irb(main):003:0> array2 << 4 6=> [1, 2, 3, 4] 7irb(main):004:0> array1 8=> [1, 2, 3]

投稿2022/04/16 13:17

melian

総合スコア19712

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

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

kanieksuke

2022/04/16 13:26

瞬殺でした笑 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問