Czy istnieje sposób na przesłonięcie ustawienia zmiennych instancji w Ruby?Jak się dowiedzieć, kiedy zmienna instancji zostanie ustawiona w Ruby
Powiedzmy ustawić instancję zmiennej:
@foo = "bar"
mogę przechwycić że i coś zrobić (jak nagrać go ani nie stawia, na przykład)
Przypuszczam, próbuję zastąpić przypisanie operator dla wszystkich typów. Czy można to nawet zrobić?
Najlepszym mam wymyślić, jak dotąd, jest to:
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
Wtedy, kiedy zdefiniować akcesor i ustawić go, mój kod zostanie wykonany:
class Test
attr_log_accessor :foo
def DoSomething
self.foo = "bar"
end
end
Niestety, wymaga to od mnie napisania self.foo = "bar", zamiast @foo = "bar".
Jakieś myśli?
tam 'trace_var' (http://www.ruby-doc.org/core/classes/Kernel.html#M005937), ale tylko dla globalnych zmiennych. –
Istnieje również moduł Observable, który może być tak blisko jak to możliwe: http://www.oreillynet.com/ruby/blog/2006/01/ruby_design_patterns_observer.html Jednak może to wymagać użycia getter/setters zamiast bezpośrednio ustawiając zmienną instancji (co jest w zasadzie jak teraz to robisz) –