我正在浏览有关Ruby模块的在线教程,扩展了老师在其中解释代码的地方
module Tracking
def create(name)
object = new(name)
instances.push(object) # note this line
return object
end
def instances
@instances ||= []
end
end
class Customer
extend Tracking
attr_accessor :name
def initialize(name)
@name = name
end
def to_s
"[#{@name}]"
end
end
这是输出
puts "Customer.instances: %s" % Customer.instances.inspect
puts "Customer.create: %s" % Customer.create("Jason")
puts "Customer.create: %s" % Customer.create("Kenneth")
puts "Customer.instances: %s" % Customer.instances.inspect
Output:
Customer.instances: []
Customer.create: [Jason]
Customer.create: [Kenneth]
Customer.instances: [#<Customer:0x007f2b23eabc08 @name="Jason">, #<Customer:0x007f2b23eabaf0 @name="Kenneth">]
我对extends
的工作方式有所了解,但我不明白的是这种方法
def create(name)
object = new(name)
instances.push(object)
return object
end
特别是instances.push(object)
线
应该不是@instances.push(object)
instances
是模块中的方法,我们如何push
将对象作为方法,它不是数组,而是包含数组。
这是怎么回事?
拜托,我是Ruby的新手,我将非常感谢简单的答案。
答案 0 :(得分:1)
instances
返回@instances
,这是一个数组,这就是为什么当您push
将其放入其中时,将其推入@instances
(变量)而不是{ {1}}(方法)。
调用instances
将创建带有空白数组的instances
并返回空白数组,从而为您提供一个占位符以将内容保留在其中。
据您所知,您甚至可以执行以下操作:
@instances