2012-01-16 3 views
0

이것은 나에게 매우 이상하게 보입니다. 그러나 나는 이전에 스크립트의 load에서 이전 값을 유지하는 스크립트를 실행하고 있습니다. req1의 값은 스크립트의 연속로드에 덤프되지 않습니다. irb에로드 된 스크립트가 이전 값을 유지하지 못하게하려면 어떻게해야합니까?

  • 는을
  • 주석 부하 명령을 통해 스크립트를 실행 (레일 c를 통해)

    • 열린 IRB : 여기
      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) } 
      

      이 단계는 다음과 같습니다 여기

      스크립트입니다 A => B 줄
    • 다시 스크립트 실행
    • 코멘트req1 객체가 거기에 'A' => 'B'있을 것이다 끝에 A => B 라인
    • 실행 스크립트를 다시

    . 스크립트가 실행될 때마다 새 객체를 만드는 것처럼 보이기 때문에 이것이 왜 일어날 지 잘 모르겠습니다. 그것은 모든 실행에 개체가 기억되고있는 것으로 보입니다.

    이런 종류의 일을 방지하는 가장 좋은 방법은 무엇입니까? 저는 몇 가지 시도를 해봤지만 왜 처음부터 일어 났는지 이해하지 못하기 때문에 빨대를 쥐고있는 것처럼 느낍니다.

  • +0

    AmazonProduct []가 실제로하는 일에 달려 있습니다. 당신은 아무것도 제작하지 않고 AmazonProduct [ "us"]를 참조하고 있습니다. –

    +0

    그건 의미가 있지만로드간에 캐시 될까요? 출처는 http://rubydoc.info/github/hakanensari/amazon_product/master/AmazonProduct#%5B%5D-class_method입니다. 'us'는 @requests 객체로 전달됩니다. AmazonProduct 객체에 .new가 없기 때문에 이런 일이 발생합니까? – jcollum

    답변

    0

    irb를 다시 시작하지 않으므로 AmazonProduct[]의 기능에 따라 다릅니다. From its source :

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

    는 하나 아직 존재하지 않는 IFF에 새로운 요청을 만들어 캐싱입니다.

    한 가지 관점에서 "new이 없기 때문에"입니다. new은 로캘이 아직로드되지 않은 경우에만 호출됩니다. 다른 것에서는 new/not-new이지만 캐싱은 문서화하지 않고 수행 할 수 있습니다.

    행동을 감안할 때 합리적인 가정입니다. 그리고 왜 내 생각은 []의 구현이었습니다.


    irb를 다시 시작하지 관한 : 캐시를 (내가 확인하지 않았다) 다시로드 할 수있는 메커니즘이없는 경우, 할 수있는 가장 빠른 것은 원숭이 패치 []로하고 항상을위한 새로운 Request를 검색 할 것 주어진 로케일.

    +0

    나는 소스를 읽었지 만,'irb'는 어떤 스크립트를 돌리면서 문맥을 버려 오브젝트가 그런 종류의 크로스 토크를 가지지 않는 것처럼 보인다. – jcollum

    +0

    그것은 목에 진짜 고통을 테스트합니다.irb를 다시 시작하지 않고 개체를 강제로 강제 실행하라는 제안이 있습니까? – jcollum

    +0

    @jcollum 아마도 너무 늦었지만 해결 방법에 대한 의견을 추가했습니다. :) –

    관련 문제