前提・実現したいこと
配列をループで回して要素に変更を加えると、要素の変更が反映されるものと反映されないものがあります。
その理由についてご教示お願いします。
試したこと
試したところ、コメントの通りの結果となりました。
Ruby
1 numbers = [0,1,2] 2 numbers.each{|number| 3 number += 10 4 } 5 p numbers # [0, 1, 2] 6 7 my_strings = ["A", "B", "C"] 8 my_strings.each{|my_string| 9 my_string += "_add" 10 } 11 p my_strings # ["A", "B", "C"] 12 13 hash_arr = [{"key"=>""}, {"key"=>""}] 14 hash_arr.each_with_index{|my_hash, index| 15 my_hash["key"] = "value" + (index+1).to_s 16 } 17 p hash_arr # [{"key"=>"value1"}, {"key"=>"value2"}]
この結果について、
配列の数値型やString型の要素は値型なので、ループの中での要素の変更が反映されない。 配列のハッシュの要素は参照型なので、ループの中での要素の変更が反映される (ハッシュは、参照型の変数で参照されている)。
という理由なのではないかと考えていますが、こちらの認識で合っていますか?
ご教示お願いします。
追記
C#でも試してみました。
C#
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 int[] numbers = new int[3] { 0, 1, 2 }; 4 foreach (int number in numbers) 5 { 6 // number = 10; // エラー。foreachの繰り返し変数であるため、これに割り当てることはできない。 7 // number += 10; // エラー。foreachの繰り返し変数であるため、これに割り当てることはできない。 8 } 9 10 for (int i = 0; i<numbers.Length; i++) 11 { 12 if (i == numbers.Length - 1) 13 { 14 numbers[i] = 20; 15 } 16 else 17 { 18 numbers[i] += 10; 19 } 20 } 21 22 Console.WriteLine(String.Join(",", numbers)); // 10,11,30 23 24 int j = 1; 25 intAdd(j, 10); 26 Console.WriteLine(j); // 1 27 28 int[] arr = new int[2] { 0, 1 }; 29 arrAdd(arr); 30 Console.WriteLine(String.Join(",", arr)); // 5,6 31 32 } 33 34 void intAdd(int a, int b) 35 { 36 a += b; 37 } 38 39 void arrAdd(int[] arr) 40 { 41 arr[0] = 5; 42 arr[1] += 5; 43 }
追記②
Ruby
1 p hash_arr # [{"key"=>"value1"}, {"key"=>"value2"}] 2 3 hash_arr.each_with_index{|my_hash, index| 4 i = (index+1).to_s 5 my_hash.store("k"+i, "v"+i) 6 } 7 8 p hash_arr # [{"key"=>"value1", "k1"=>"v1"}, {"key"=>"value2", "k2"=>"v2"}]
C#
1 List<int> list = new List<int> { 1, 2, 3 }; 2 addList(list); 3 Console.WriteLine(String.Join(",", list)); // 1,2,3,4 4 5 void addList(List<int> list) 6 { 7 list.Add(4); 8 list = new List<int> { 0 }; 9 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 18:07
2021/03/20 03:08
2021/03/20 05:14
2021/03/20 05:21
2021/03/20 05:46
2021/03/20 06:00 編集
2021/03/20 08:03
2021/03/20 08:58
2021/03/20 09:48
2021/03/20 12:23
2021/03/23 14:30
2021/03/23 14:45
2021/03/23 15:50 編集
2021/03/23 15:57
2021/03/23 15:59