Как вызвать метод для загрузки переменной класса в Ruby? - PullRequest
2 голосов
/ 03 апреля 2012

Данные загружаются один раз, потому что для их загрузки требуется некоторое время, они не изменяются и используются совместно. Это статический класс: я не использую экземпляры.

class Foo
  @@ data = self.load_data

  def self.load_data
    .
    . 
    .
  end

  def self.calculate
    .
    .
  end
end

Это выдает ошибку NoMethodError: undefined method 'load_data' for Foo:Class, поскольку load_data появляется после назначения.

Я не думаю, что инициализация будет работать, потому что я не использую f = Foo.new. Я использую это как Foo.calculate.

Необходимо ли объявлять load_data перед его вызовом? Или есть лучший подход?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Да Foo.load_data еще не существует в точке, где вы ее называете.

Лучшим вариантом может быть наличие средства доступа к @@ data, которое автоматически запоминает.

class Foo
  def self.data
    @@data ||= load_data
  end
  def data; self.class.data; end # if you need it in instances too

  def self.load_data
    ...
  end

  def self.calculate
    data.each {} # or whatever would have used @@data
  end
end
0 голосов
/ 03 апреля 2012

Загрузка данных вызовом функции уровня класса.

class Foo
  def self.load_data
    .
    . 
    .
    @data = value
  end

  def self.calculate
   #use @data in this function.
   .
   .
  end
end

#first load data
Foo.load_data

#then process data
Foo.calculate
...