セルジオのソリューションは良いですが、不必要に複雑です:attr_reader
の動作を複製する必要はありません。ただ委任するだけです。そして、この二重のモジュールにフックのハッカーを含める必要はありません。さらに、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
何か試しましたか? –
ええ、私はしましたが、私は再び試したときに動作するので、私はタイプミスをしたと思います。あなたは正しい、私はそれを投稿しておくべきだった。 –