类中的数组,其中包含从类外部调用的所有对象

时间:2018-12-20 08:18:40

标签: ruby class

创建类对象时,我希望我的方法将类对象放入数组中。而且它必须在课堂外是可以到达的。我试图这样:

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类中解决此问题。

我该怎么做?

2 个答案:

答案 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相同的结果。