基本上我不知道如何将在Ruby对象回调,这样,当一个对象,无论如何变化,我可以自动触发其他变化:红宝石:在“ATTR”有回调对象
(编辑:我因为@proxy是一个URI对象,它拥有它自己的方法,通过使用它自己的方法来改变URI对象并不会调用我自己的方法并更新@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 2010-05-25 15:00:11
我不明白,你会得到'Net :: HTTP' ...?如果添加'attr_reader:http'并检查'p m.http',可以检查它。当'm.proxy'改变时,'proxy ='不会被调用吗?该函数调用是唯一发生的事情 - 您不能直接在Ruby中更改实例变量。 – Amadan 2010-05-25 15:02:14
啊裤子,我在我的例子中迷惑了自己!如果@proxy URI对象的子对象发生更改(请参阅我的示例代码的最后4行),则不会调用'proxy ='方法 - 希望这更有意义吗? – 2010-05-26 08:48:03