【发布时间】:2026-01-07 18:45:02
【问题描述】:
有没有办法覆盖 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"。
有什么想法吗?
【问题讨论】:
-
有
trace_var(ruby-doc.org/core/classes/Kernel.html#M005937),但仅适用于全局变量。 -
还有 Observable 模块,它可能尽可能接近这个:oreillynet.com/ruby/blog/2006/01/… 但是,这可能需要使用 getter/setter 而不是直接设置实例变量(这基本上是你如何'现在正在做)
标签: ruby