Как установить переменную экземпляра из метода класса? - PullRequest
1 голос
/ 20 ноября 2010

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

module ActiveRecord
   class Base
      def self.included(base)
         base.class.send(:define_method, :my_macro) do |args|
            # instance_variable_set for the model instance that has called this 
            # macro using args
         end
      end
   end
end

Я пробовал class_eval, instance_eval .. но, похоже, ничего не работает, или я не знаю, как их использовать.

Заранее спасибо.

Редактировать : Позвольте мне попытаться объяснить лучше. У меня есть метод класса. Экземпляр класса вызывает этот метод. Теперь этот метод класса должен проинструктировать экземпляр для установки переменной экземпляра для себя.

Редактировать - вот как я хочу использовать макрос

class MyModel < ActiveRecord::Base
   my_macro(*args)
   def after_initialize
      # use the value set in the macro as @instance variable
   end
end

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

Хм .. Не включен () метод модуля?Я не думаю, что вы можете использовать это в классе, как вы написали.Если вы хотите создать метод класса, вы можете сделать

class Base
  def self.my_method
  end

или

class Base
  class << self
    def my_method
    end
  end

Если вам нужно только добавить переменную экземпляра к существующему объекту, тогдаиспользуйте # instance_variable_set

class Base
  class << self
    def my_method(instance_of_base, value)
      instance_of_base.instance_variable_set "@x", value
    end
  end
end

a = Base.new
a.class.send(:my_method, *[a,4])
0 голосов
/ 20 ноября 2010

Это то, о чем вы думаете:

class DynamicAdd
  def add_method
    self.class_eval do
      attr_accessor :some_method
    end
  end
end

Затем вы можете сделать следующее:

k = DynamicAdd.new
k.some_method = "hi"

должно привести к неопределенной ошибке метода.

Но

k = DynamicAdd.new
k.add_method
k.some_method = "hi"

должно работать.

Этот же формат можно использовать для определения других типов методов, кроме attr_accessors:

class DynamicAdd
  def add_method
    self.class_eval do
      def some_method
        return "hi"
      end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...