Как я могу запретить скрипту, загруженному в irb, сохранять предыдущие значения? - PullRequest
0 голосов
/ 17 января 2012

Это кажется мне очень странным, но у меня есть скрипт, который я запускаю, который каким-то образом сохраняет предыдущие значения предыдущих load s скрипта. Значения в 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) }

Вот шаги:

  • открытый IRB (через рельсы с)
  • запустить скрипт с помощью команды загрузки
  • раскомментировать строка A => B
  • запустить скрипт снова
  • комментарий строка A => B
  • запустить скрипт снова

В конце у объекта req1 будет 'A' => 'B'. Мне неясно, почему это происходит, так как похоже, что я создаю новый объект при каждом запуске сценария. Похоже, что объект запоминается при каждом запуске.

Как лучше всего предотвращать подобные вещи? Я попробовал несколько вещей, но чувствую, что цепляюсь за соломинку, так как не понимаю, почему это происходит.

1 Ответ

0 голосов
/ 17 января 2012

Вы не перезапускаете irb, поэтому это зависит от того, что делает AmazonProduct[]. Из источника :

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

Это кеширование, создание нового запроса если еще не существует.

С одной точки зрения,это "потому что у него нет new".new вызывается только тогда, когда локаль еще не загружена.С другой стороны, это меньше new / not- new, но кэширование без документирования может сделать это.

Учитывая поведение, это разумное предположение - и почему моя первая мысль была []Реализация.


Относительно не перезапуска irb: если нет механизма для перезагрузки кэша (я не проверял), самый быстрый способ сделать это - monkey-patch [] и всегда получать новый Request для данной локали.

...