我想实现一个(类)方法 attr_accessor_with_client_reset
,它与 attr_accessor
做同样的事情,但它在每个 writer 上额外执行
@client = nil
例如,
attr_accessor_with_client_reset :foo
应该产生与
相同的结果attr_reader :foo
def foo=(value)
@foo = value
@client = nil
end
我如何实现这一目标?
最佳答案
Sergio 的解决方案很好,但不必要地复杂:无需复制 attr_reader
的行为,您只需委托(delegate)给它即可。并且不需要所有这些双模块都包含 hook hackery。另外,attr_accessor
有多个名称,所以 attr_accessor_with_client_reset
也应该。
module AttrAccessorWithClientReset
def attr_accessor_with_client_reset(*names)
attr_reader *names
names.each do |name|
define_method :"#{name}=" do |v|
instance_variable_set(:"@#{name}", v)
@client = nil
end
end
end
end
class Foo
extend AttrAccessorWithClientReset
attr_reader :client
def initialize
@foo = 0
@client = 'client'
end
attr_accessor_with_client_reset :foo
end
f = Foo.new
f.foo # => 0
f.client # => "client"
f.foo = 1
f.foo # => 1
f.client # => nil
关于ruby - 如何增强 ruby 中的 attr_accessor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410391/