Простое метапрограммирование некоторых геттеров - PullRequest
1 голос
/ 18 февраля 2012

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

RESOURCES = %w(wood stone gold)

class << self
    RESOURCES.each do |resource|
        define_method "#{resource}" do
            resource
        end
    end
end     

Внутри приложения rails, но при выполнении я получаю неопределенный метод дерева.Любые идеи, почему?

(Этот код находится внутри класса Rails класса City

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Вы определяете метод класса, а не метод экземпляра.

Смотрите, что происходит при попытке:

City.wood
=> "wood"

Предполагая, что вы хотите, чтобы он был методом экземпляра:

RESOURCES = %w(wood stone gold)

RESOURCES.each do |resource|
    define_method "#{resource}" do
        resource
    end
end
1 голос
/ 18 февраля 2012

Вы определяете древесину метода класса, а не метод экземпляра.Вам нужно будет вызвать

City.wood

Если вы вызовите define_method вне класса << self, вы будете определять методы экземпляра. </p>

class City < Object
  RESOURCES = %w(wood stone gold)
  RESOURCES.each do |resource|
    define_method "#{resource}" do
      resource
    end
  end  
end
city = City.new
puts city.wood
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...