创建类对象时,我希望我的方法将类对象放入数组中。而且它必须在课堂外是可以到达的。我试图这样:
class Object1
@@obj_all = []
attr_accessor :id, :name
def initialize id, name
@id = id
@name = name
@@obj_all << self
end
def self.obj_all
@@obj_all
end
end
a1 = Object1.new(0,"A")
a2 = Object1.new(1,"A")
a3 = Object1.new(2,"A")
a4 = Object1.new(3,"A")
p Object1.obj_all
结果还可以,但是当我要使用p obj_all
而不是p Object1.obj_all
时,出现错误。
如您所见,我可以这样做:
all_obj = []
all_obj[0] = Object1.new(0,"A")
all_obj[1] = Object1.new(1,"A")
all_obj[2] = Object1.new(2,"A")
all_obj[3] = Object1.new(3,"A")
所以我有一个'all_obj'数组,可以根据需要编辑。但我想在Object1类中解决此问题。
我该怎么做?
答案 0 :(得分:0)
如果我对这个问题的理解是正确的,那么您就可以实现重新定义Class::new的目标。由于这是一个类方法,因此必须在Object1
的单例类中进行重新定义。通过调用class << self
将作用域更改为单例类,并且在达到关联的end
之前,作用域一直保持有效。
class Object1
attr_accessor :name
@obj_all = []
def initialize name
@name = name
end
class << self
attr_reader :obj_all
def new(name)
obj_all << super
obj_all.last
end
end
end
Object1.new('Bob')
#=> #<Object1:0x00007ffcf49c7f40 @name="Bob">
Object1.new('Sal')
#=> #<Object1:0x00007ffcf49bfef8 @name="Sal">
Object1.new('Eva')
#=> #<Object1:0x00007ffcf49b6bc8 @name="Eva">
Object1.obj_all
#=> [#<Object1:0x00007ffcf49c7f40 @name="Bob">,
# #<Object1:0x00007ffcf49bfef8 @name="Sal">,
# #<Object1:0x00007ffcf49b6bc8 @name="Eva">]
Object1.obj_all.map(&:name)
#=> ["Bob", "Sal", "Eva"]
请参阅文档以获取关键字super。
答案 1 :(得分:-1)
您需要存储对象而不是id
。
所以,代替这个-@@obj_all << self.id
,
按以下方式操作:@@obj_all << self
。
这将为您带来与all_obj
相同的结果。