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

とは 2 つの異なるオブジェクトであるとobject_id言って、どちらが答えを与えるかを確認してください。selfself#dup

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

配列の複製を作成すると、次の例のように、同じ要素を持つ 2 つの別個の配列が作成されます。

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 に答える