这对我来说似乎很奇怪,但我有一个我正在运行的脚本,它以某种方式保留了脚本之前load
的先前值。 req1
中的值不会在连续加载脚本时被转储。
这是脚本:
require 'amazon_product'
req1 = nil
req1 = AmazonProduct["us"]
puts req1.inspect
req1.configure do |c|
c.key = "[...]"
c.secret = "[...]"
c.tag = "[...]"
end
puts req1.inspect
req1 << {
'Version' => '2010-11-01',
'Operation' => 'ItemLookup',
'SearchIndex' => "Books",
'Keywords' => 'Corrections'
#, 'A' => 'B'
}
puts req1.inspect
resp = req1.get
File.open( File.join(File.dirname(__FILE__),
"amazon_response.xml"), 'w') {|f| f.write(resp.body) }
以下是步骤:
最后,req1
对象中会有'A' => 'B'
。我不清楚为什么会发生这种情况,因为看起来我在脚本的每次运行中都在创建一个新对象。似乎每次运行都会记住该物体。
防止此类事情的最佳做法是什么?我尝试了一些事情,但感觉我正在抓住稻草,因为我不明白为什么它首先发生。
答案 0 :(得分:0)
你没有重新启动irb,所以它取决于AmazonProduct[]
的作用。 From its source:
def self.[](locale)
@requests[locale] ||= Request.new(locale)
end
它正在缓存,创建一个新请求 iff 还没有。
从一个角度来看,它是“因为它没有new
”。仅在尚未加载语言环境时调用new
。从另一个开始,它更少new
/不 - new
,但缓存,而不记录它可能会这样做。
鉴于这种行为,这是一个合理的假设 - 为什么我的第一个想法是[]
的实施。
关于不重启irb
:如果没有重新加载缓存的机制(我没有检查),最快的事情就是猴子补丁[]
并且总是检索一个对于给定的区域设置,新Request
。