一千萬個為什麽

搜索

如何知道在Ruby中設置實例變量的時間

有沒有辦法在Ruby中覆蓋實例變量的設置?

假設我設置了一個實例變量:

@foo = "bar"

我可以截取並執行某些操作(例如記錄或放置)

我想,我試圖覆蓋所有類型的賦值運算符。甚至可以這樣做嗎?

到目前為止,我提出的最好的是:

class Module
  def attr_log_accessor( *symbols )
    symbols.each { | symbol |
      module_eval( "def #{symbol}() @#{symbol}; end" )
      module_eval( "def #{symbol}=(val) 
                      @#{symbol} = val
                      puts \"#{symbol} has changed\"
                    end" )
    }
  end
end

然後,當我定義訪問器並設置它時,我的代碼被執行:

class Test
  attr_log_accessor :foo

  def DoSomething
    self.foo = "bar"
  end
end

不幸的是,這需要我寫self.foo =“bar”,而不是@foo =“bar”。

有什麽想法嗎?

最佳答案

不,你不能直接這樣做。最好的方法是只通過getter/setter方法訪問實例變量並覆蓋它們。

轉載註明原文: 如何知道在Ruby中設置實例變量的時間