Essentiellement, je me demande comment placer callbacks sur des objets en rubis, de sorte que lorsqu'un objet est changé en tout cas je peux déclencher automatiquement d'autres changements:Ruby: ayant callbacks sur « attr » objets
(EDIT: Je comme @proxy est un objet URI il a ses propres méthodes, changer l'objet URI en utilisant ses propres méthodes n'appelle pas ma propre méthode proxy=
et met à jour l'objet @http)
class MyClass
attr_reader :proxy
def proxy=(string_proxy = "")
begin
@proxy = URI.parse("http://"+((string_proxy.empty?) ? ENV['HTTP_PROXY'] : string_proxy))
@http = Net::HTTP::Proxy.new(@proxy.host,@proxy.port)
rescue
@http = Net::HTTP
end
end
end
m = MyClass.new
m.proxy = "myproxy.com:8080"
p m.proxy
# => <URI: @host="myproxy.com" @port=8080>
m.proxy.host = 'otherproxy.com'
p m.proxy
# => <URI: @host="otherproxy.com" @port=8080>
# But accessing a website with @http.get('http://google.com') will still travel through myproxy.com as the @http object hasn't been changed when m.proxy.host was.
Que voulez-vous dire « comme proxy = est pas appelé »? Bien sûr, ça s'appelle. – sepp2k
Je ne comprends pas, vous obtenez 'Net :: HTTP' ...? Vous pouvez le vérifier si vous ajoutez un 'attr_reader: http' et inspectez' p m.http'. Que voulez-vous dire 'proxy =' n'est pas appelé quand 'm.proxy' est changé? Cet appel de fonction est la seule chose qui arrive - vous ne pouvez pas directement modifier les variables d'instance dans Ruby. – Amadan
Ahh pantalons, je me suis confus dans mon exemple! La méthode 'proxy =' ne sera pas appelée si les objets fille de l'objet @proxy URI sont modifiés (voir les 4 dernières lignes de mon exemple de code) - espérons que cela a plus de sens? –