Массив в классе, который содержит все объекты, вызываемые извне класса - PullRequest
0 голосов
/ 20 декабря 2018

Когда я создаю объект класса, я хочу, чтобы мой метод помещал мои объекты класса в массив.И также это должно быть достижимо вне класса.Я пытался, как это:

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 голосов
/ 21 декабря 2018

Если мое понимание вопроса верное, вы можете добиться того, что вы хотите, переопределив 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 .

0 голосов
/ 20 декабря 2018

Вам нужно хранить объект вместо id.

Итак, вместо этого - @@obj_all << self.id,

сделать это как: @@obj_all << self.

Это даст вам тот же результат, что вы сделали для all_obj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...