Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Ruby附加到数组_Arrays_Ruby_Append - Fatal编程技术网

Arrays Ruby附加到数组

Arrays Ruby附加到数组,arrays,ruby,append,Arrays,Ruby,Append,在下面的代码行中,我预期的结果与实际结果不同。有人能帮我理解为什么吗 array1 = [["a", "b", "c"], ["a", "b", "c"]] temp1 = ["x", "y", "z"] array1 << temp1 2.times do temp1[0] = gets.chomp #first loop enter 1 and then 4 temp1[1] = gets.chomp #first loop enter 2 and

在下面的代码行中,我预期的结果与实际结果不同。有人能帮我理解为什么吗

array1 = [["a", "b", "c"], ["a", "b", "c"]]
temp1 = ["x", "y", "z"]
array1 << temp1

2.times do
  temp1[0] = gets.chomp      #first loop enter 1 and then 4
  temp1[1] = gets.chomp      #first loop enter 2 and then 5
  temp1[2] = gets.chomp      #first loop enter 3 and then 6
  puts temp1.inspect
  array1 << temp1
  puts array1.inspect        
  # Actual result: [["a", "b", "c"], ["a", "b", "c"], ["4", "5", "6"], ["4", "5", "6"], ["4", "5", "6"]]                          
  # Expected Result: [["a", "b", "c"], ["a", "b", "c"], ["x", "y", "z"], ["1", "2", "3"], ["4", "5", "6"]]
end
array1=[[“a”、“b”、“c”]、[“a”、“b”、“c”]]
temp1=[“x”、“y”、“z”]
array1执行此操作,它将起作用(将.clone添加到对
temp1
的所有引用中):

array1=[[“a”、“b”、“c”]、[“a”、“b”、“c”]]
temp1=[“x”、“y”、“z”]
array1执行此操作,它将起作用(将.clone添加到对
temp1
的所有引用中):

array1=[[“a”、“b”、“c”]、[“a”、“b”、“c”]]
temp1=[“x”、“y”、“z”]

array1每当您遇到像这样的问题时,添加一些代码以在计算的每个步骤中打印出每个感兴趣对象的
对象id
,这是很有指导意义的。每个Ruby对象都有一个唯一的
对象id
。可以使用以下方法检索id:

让我们试试看。(我已将
对象id
缩短到最后三位,以便在更改时更容易看到。)

你需要仔细研究这一点

要理解发生了什么,将数组视为容器可能会有所帮助。您所做的是更改容器的内容,而不是容器本身,但是
array1
是一个容器列表

要使代码正常工作,只需更改容器和内容。一种简单的方法是替换:

temp1[0] = gets.chomp
temp1[1] = gets.chomp
temp1[2] = gets.chomp


每当您遇到类似这样的问题时,添加一些代码以在计算的每个步骤中打印出每个感兴趣对象的
object\u id
,这是很有指导意义的。每个Ruby对象都有一个唯一的
对象id
。可以使用以下方法检索id:

让我们试试看。(我已将
对象id
缩短到最后三位,以便在更改时更容易看到。)

你需要仔细研究这一点

要理解发生了什么,将数组视为容器可能会有所帮助。您所做的是更改容器的内容,而不是容器本身,但是
array1
是一个容器列表

要使代码正常工作,只需更改容器和内容。一种简单的方法是替换:

temp1[0] = gets.chomp
temp1[1] = gets.chomp
temp1[2] = gets.chomp


您正在追加和修改同一数组。为什么即使我追加到同一数组,它也不是连续的?(因此,第一个循环我将1,2,3附加到数组1,然后再附加4,5,6)(我是新手)不,你是在附加和变异同一个数组。在123时追加一次。然后将其更改为456,这意味着您已经附加的更改为456,然后再次附加。您正在附加和修改同一数组。为什么即使我附加到同一数组,它也不是顺序的?(因此,第一个循环我将1,2,3附加到数组1,然后再附加4,5,6)(我是新手)不,你是在附加和变异同一个数组。在123时追加一次。然后您将其更改为456,这意味着您已经添加的内容将更改为456,然后您将再次添加它。我很高兴它有帮助:)我很高兴它有帮助:)
array1 = [["a", "b", "c"], ["a", "b", "c"]]
puts "1a array1.object_id=#{array1.object_id % 1000}"
puts "1b array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
puts
temp1 = ["x", "y", "z"]
puts "2a temp1.object_id=#{temp1.object_id % 1000}"
array1 << temp1
puts "2b array1=#{array1.inspect}"
puts "2c array1.object_id=#{array1.object_id % 1000}"
puts "2d array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
puts
2.times do
  temp1[0] = gets.chomp
  temp1[1] = gets.chomp
  temp1[2] = gets.chomp
  puts "3a temp1=#{temp1.inspect}"
  puts "3b temp1.object_id=#{temp1.object_id % 1000}"
  array1 << temp1
  puts "3c array1=#{array1.inspect}"
  puts "3d array1.object_id=#{array1.object_id % 1000}"
  puts "3e array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
  puts 
end
1a array1.object_id=900
1b array1.map(&:object_id)=[0, 920]

2a temp1.object_id=480
2b array1=[["a", "b", "c"], ["a", "b", "c"], ["x", "y", "z"]]
2c array1.object_id=900
2d array1.map(&:object_id)=[0, 920, 480]

1
2
3
3a temp1=["1", "2", "3"]
3b temp1.object_id=480
3c array1=[["a", "b", "c"], ["a", "b", "c"], ["1", "2", "3"], ["1", "2", "3"]]
3d array1.object_id=900
3e array1.map(&:object_id)=[0, 920, 480, 480]

4
5
6
3a temp1=["4", "5", "6"]
3b temp1.object_id=480
3c array1=[["a", "b", "c"], ["a", "b", "c"], ["4", "5", "6"], ["4", "5", "6"],
           ["4", "5", "6"]]
3d array1.object_id=900
3e array1.map(&:object_id)=[0, 920, 480, 480, 480]
temp1[0] = gets.chomp
temp1[1] = gets.chomp
temp1[2] = gets.chomp
temp1 = [gets.chomp, gets.chomp, gets.chomp]

array1 = [["a", "b", "c"], ["a", "b", "c"]]
puts "1a array1.object_id=#{array1.object_id % 1000}"
puts "1b array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
puts
temp1 = ["x", "y", "z"]
puts "2a temp1.object_id=#{temp1.object_id % 1000}"
array1 << temp1
puts "2b array1=#{array1.inspect}"
puts "2c array1.object_id=#{array1.object_id % 1000}"
puts "2d array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
puts
2.times do
  temp1 = [gets.chomp, gets.chomp, gets.chomp]
  puts "3a temp1=#{temp1.inspect}"
  puts "3b temp1.object_id=#{temp1.object_id % 1000}"
  array1 << temp1
  puts "3c array1=#{array1.inspect}"
  puts "3d array1.object_id=#{array1.object_id % 1000}"
  puts "3e array1.map(&:object_id)=#{array1.map { |e| e.object_id % 1000 } }"
  puts 
end
1a array1.object_id=100
1b array1.map(&:object_id)=[220, 120]

2a temp1.object_id=660
2b array1=[["a", "b", "c"], ["a", "b", "c"], ["x", "y", "z"]]
2c array1.object_id=100
2d array1.map(&:object_id)=[220, 120, 660]

1
2
3
3a temp1=["1", "2", "3"]
3b temp1.object_id=800
3c array1=[["a", "b", "c"], ["a", "b", "c"], ["x", "y", "z"], ["1", "2", "3"]]
3d array1.object_id=100
3e array1.map(&:object_id)=[220, 120, 660, 800]

4
5
6
3a temp1=["4", "5", "6"]
3b temp1.object_id=580
3c array1=[["a", "b", "c"], ["a", "b", "c"], ["x", "y", "z"], ["1", "2", "3"],
           ["4", "5", "6"]]
3d array1.object_id=100
3e array1.map(&:object_id)=[220, 120, 660, 800, 580]