ruby将数组赋给另一个变量,当从原始数组中删除该分配变量的元素时也是如此

时间:2016-11-12 04:27:18

标签: arrays ruby

我面临着奇怪的问题。我下面有一个数组。

irb(main):007:0> original_array = []
=> []
irb(main):008:0> original_array.push("word1")
=> ["word1"]
irb(main):009:0> original_array.push("word2")
=> ["word1", "word2"]
irb(main):010:0> puts "#{original_array.inspect}"
["word1", "word2"]
=> nil
irb(main):011:0>

所以当我将这个数组分配给另一个数组变量时,

irb(main):011:0> assigned_array = []
=> []
irb(main):012:0> assigned_array = original_array
=> ["word1", "word2"]
irb(main):013:0>
irb(main):014:0> puts "#{assigned_array.inspect}"
["word1", "word2"]
=> nil
irb(main):015:0>

现在当我从assigned_array中删除en元素时,它也会从原始数组中删除。

irb(main):015:0> assigned_array.delete("word2")
=> "word2"
irb(main):016:0> puts "#{assigned_array.inspect}"
["word1"]
=> nil
irb(main):017:0> puts "#{original_array.inspect}"
["word1"]
=> nil

我不确定它是否是红宝石的实际行为。如果是这样,当我从assigned_array删除一个不应该从original_array中删除的元素时,有没有办法将original_array分配给assigned_array变量?

1 个答案:

答案 0 :(得分:4)

是的,这是红宝石的预期行为。您可以通过执行assigned_array = original_array.clone来复制它。注意:这会创建一个浅表副本(此处有更多信息https://en.wikipedia.org/wiki/Object_copying#Shallow_copy

从另一个非文字(a = b)分配非文字不会复制对象的内容,只是复制引用。结果是original_array和assigned_array都是数组的相同实例,因此修改一个修改另一个,因为它们是同一个对象。

脚本示例:

original_array = ["word1", "word2"]
puts original_array.inspect #=> ["word1", "word2"]
assigned_array = original_array.clone
assigned_array.delete("word2")
puts assigned_array.inspect #=> ["word1"]
puts original_array.inspect #=> ["word1", "word2"]