Existe-t-il un moyen de remplacer le paramètre des variables d'instance dans Ruby?Comment savoir quand une variable d'instance est définie dans Ruby
Disons que je mets une variable d'instance:
@foo = "bar"
Puis-je intercepter cela et faire quelque chose (comme enregistrement ou met, par exemple)
Je suppose, je suis en train de passer outre l'affectation opérateur pour tous les types. Est-ce faisable?
Le meilleur que je suis venu avec, à ce jour, est la suivante:
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
Puis, quand je définis l'accesseur et IMPOSEES, mon code est exécuté:
class Test
attr_log_accessor :foo
def DoSomething
self.foo = "bar"
end
end
Malheureusement, cela m'oblige à écrire self.foo = "bar", au lieu de @foo = "bar".
Des pensées?
il y a 'trace_var' (http://www.ruby-doc.org/core/classes/Kernel.html#M005937), mais pour les vars globales seulement. –
Il y a aussi le module Observable, qui peut être aussi proche de cela que possible: http://www.oreillynet.com/ruby/blog/2006/01/ruby_design_patterns_observer.html Cependant, cela peut nécessiter l'utilisation de getters/setters au lieu de Définir directement la variable d'instance (ce qui est fondamentalement la façon dont vous le faites maintenant) –