实例变量在没有明确告知的情况下进行更改

时间:2017-05-26 18:43:15

标签: ruby

这是一个非常奇怪的事。

所以我有一个班级LibSystem

class LibSystem
  attr_accessor :borrower
  attr_reader :books
  def initialize(book_inventory = [])
    @borrower = []
    @books = book_inventory
    @borrowed = []
  end
#...
end

从另一个文件require_relative和包含它的文件。然后我这样做......

#...
sys = LibSystem.new(books)
puts sys.books.length
books << Book.new("Adventure Of My New Cat", "3-598-21515-0", "3", "funny publications", "2001", [auth3], 1)
puts sys.books.length

我期望第一个长度是9(传递给构造函数的数组的大小),第二个长度是相同的。相反,我得到9和10。这似乎是我的sys对象中的实例变量与传递给它的数组一起更新。这对我来说似乎完全错了。我在这里做错了什么,或者这是标准行为?谢谢。

标题可能不准确,如果你有更好的东西,请随时编辑。

1 个答案:

答案 0 :(得分:1)

Ruby中的数组和散列默认情况下未复制。在LibSystem内,您将传递的book_inventory分配给@books实例变量;您的新LibSystem实例仅保留现有阵列的地址,而不复制内容。当您使用<<附加到数组时,您修改了相同的数组

有时候认为复制初始化程序中使用的数组或词典是一种很好的做法,以避免这种干扰,尽管您的用例可能会有所不同。