По существу я задаюсь вопросом, как поместить обратные вызовы на объекты в рубин, так что, когда объект изменен в любом случае я могу автоматически вызвать другие изменения:Ruby: имеющие обратные вызовы на «ATTR» объекты
(EDIT: Я запутался в моем собственном примере! Не очень хороший знак ... Поскольку @proxy - это объект URI, он имеет свои собственные методы, изменение объекта URI с помощью собственных методов не вызывает мой собственный метод proxy=
и обновляет объект @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.
Что вы имеете в виду «как прокси = не вызывается»? Конечно, это называется. – sepp2k
Я не понимаю, вы получаете 'Net :: HTTP' ...? Вы можете проверить его, если вы добавили 'attr_reader: http' и проверили' p m.http'. Что значит 'proxy =' не вызывается при изменении 'm.proxy'? Этот вызов функции - это единственное, что происходит - вы не можете напрямую изменять переменные экземпляра в Ruby. – Amadan
Ahh pants, я смутил себя в своем примере! Метод 'proxy =' не будет вызываться, если дочерние объекты объекта URI @proxy будут изменены (см. Последние 4 строки моего примерного кода) - надеюсь, что это имеет смысл? –