如何防止加载到irb中的脚本保留以前的值?

时间:2012-01-16 23:38:22

标签: ruby irb

这对我来说似乎很奇怪,但我有一个我正在运行的脚本,它以某种方式保留了脚本之前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) }

以下是步骤:

  • open irb(via rails c)
  • 通过加载命令
  • 运行脚本
  • 取消注释 A =&gt; B行
  • 再次运行脚本
  • 评论 A =&gt; B行
  • 再次运行脚本

最后,req1对象中会有'A' => 'B'。我不清楚为什么会发生这种情况,因为看起来我在脚本的每次运行中都在创建一个新对象。似乎每次运行都会记住该物体。

防止此类事情的最佳做法是什么?我尝试了一些事情,但感觉我正在抓住稻草,因为我不明白为什么它首先发生。

1 个答案:

答案 0 :(得分:0)

你没有重新启动irb,所以它取决于AmazonProduct[]的作用。 From its source

def self.[](locale)
  @requests[locale] ||= Request.new(locale)
end

它正在缓存,创建一个新请求 iff 还没有。

从一个角度来看,它是“因为它没有new”。仅在尚未加载语言环境时调用new。从另一个开始,它更少new /不 - new,但缓存,而不记录它可能会这样做。

鉴于这种行为,这是一个合理的假设 - 为什么我的第一个想法是[]的实施。


关于不重启irb:如果没有重新加载缓存的机制(我没有检查),最快的事情就是猴子补丁[]并且总是检索一个对于给定的区域设置,新Request