2010-11-20 62 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