2010-11-20 63 views
1

我正在尝试执行自定义活动记录宏。但它现在似乎不可能从它的块内设置一个实例变量..这是我正在尝试做的。如何从类方法设置实例变量?

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 
+0

嗯......除非Ruby重新定义了术语“类方法”,否则类方法的要点是没有实例? – delnan 2010-11-20 16:59:39

+0

这就是我的想法。我感兴趣的是看看是否有办法告诉实例如何动态地添加自己的实例变量。 – 2010-11-20 17:12:39

+0

@greg,@delnan:是的..我完全同意......但我想知道是否有一种方法告诉它的实例将实例变量添加到自己。 – ZX12R 2010-11-20 17:27:36

回答

0

这是你在想什么的:

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 
+0

你的'add_method'是一个常规的方法,而不是像OP所要求的类方法。 – 2010-11-21 00:41:10

+0

我觉得OP是要求一个动态的方式来告诉一个实例添加一个实例变量:“是的..我完全同意......但我想知道是否有该类告诉它的实例添加一个实例的方式变量本身“ – 2010-11-21 08:55:34

0

嗯..不包括()的模块的方法?我认为你不能像你写的那样在课堂上使用它。如果你想创建一个类的方法,你可以做

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

你是对的。但我不想在每次实例化时发送该方法。我希望它是自动的。因此是一个宏观。是否有可能将类的实例作为参数发送给宏方法? – ZX12R 2010-11-22 05:16:35