这是一个非常奇怪的事。
所以我有一个班级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
对象中的实例变量与传递给它的数组一起更新。这对我来说似乎完全错了。我在这里做错了什么,或者这是标准行为?谢谢。
标题可能不准确,如果你有更好的东西,请随时编辑。
答案 0 :(得分:1)
Ruby中的数组和散列默认情况下未复制。在LibSystem
内,您将传递的book_inventory
分配给@books
实例变量;您的新LibSystem
实例仅保留现有阵列的地址,而不复制内容。当您使用<<
附加到数组时,您修改了相同的数组。
有时候认为复制初始化程序中使用的数组或词典是一种很好的做法,以避免这种干扰,尽管您的用例可能会有所不同。