2

所以我遇到的问题是理解和之间的= self区别= self dup。当我在我放入的任何数组下面运行代码时,它都会被永久更改。

class Array
  def pad(min_size, value = nil)
    input = self
    counter = min_size.to_i - self.length.to_i
    counter.times do
      input.push(value)
    end
    input
  end
end

但后来我注意到,如果我把它放上去input = self.dup,它不会永久改变我的数组。有人可以解释为什么吗?谢谢!

class Array
  def pad(min_size, value = nil)
    input = self.dup
    counter = min_size.to_i - self.length.to_i
    counter.times do
        input.push(value)
    end
    input
  end
end
4

3 回答 3

2

检查他们object_id哪个会给你答案,说selfself#dup是 2 个不同的对象。

class Array
  def dummy
    [self.object_id,self.dup.object_id]
  end
  def add
    [self.push(5),self.dup.push(5)]
  end 
end

a = [12,11]
a.dummy # => [80922410, 80922400]
a.add # => [[12, 11, 5], [12, 11, 5, 5]]
a # => [12, 11, 5]
于 2013-09-07T22:22:54.090 回答
0

因为self.dup返回数组的浅拷贝,所以代码不会永久更改数组。

参考

于 2013-09-07T22:09:29.260 回答
0

当你复制你的数组时,你最终得到了两个独立的数组,其中包含相同的元素,就像在这个例子中一样:

x = [1, 2, 3]
y = [1, 2, 3]

x << 4
p x
p y

--output:--
[1, 2, 3, 4]
[1, 2, 3]

您不会期望 x 数组的更改会影响 y 数组,对吗?相似地:

arr = [1, 2, 3]
puts "arr = #{arr}"     #arr = [1, 2, 3

copy = arr.dup
puts "copy = #{copy}"   #copy = [1, 2, 3]

arr << 4
puts "arr = #{arr}"     #arr = [1, 2, 3, 4]
puts "copy = #{copy}"   #copy = [1, 2, 3]

copy << "hello"
puts "arr = #{arr}"     #arr = [1, 2, 3, 4]
puts "copy = #{copy}"   #copy = [1, 2, 3, "hello"]

在该示例中,arr 扮演 self 的角色,而 copy 扮演 self.dup 的角色。数组 self 和 self.dup 是不同的数组,它们恰好具有相同的元素。

一个数组可以有无限数量的引用它的变量:

arr = [1, 2, 3]
puts "arr = #{arr}"    #arr = [1, 2, 3]

input = arr
input << 4
puts "arr = #{arr}"    #arr = [1, 2, 3, 4]

现在让我们输入另一个数组:

copy = arr.dup
input = copy
input << "hello"

puts "copy = #{copy}"    #copy = [1, 2, 3, 4, "hello"]
puts "input = #{input}"  #input = [1, 2, 3, 4, "hello"]
puts "arr = #{arr}"      #arr = [1, 2, 3, 4]
于 2013-09-07T23:58:37.313 回答