2011-01-13 7 views
6

주기적으로이 예외가 발생합니다."종료 된 객체"란 무엇이며 왜 메소드를 호출 할 수 없습니까?

NotImplementedError: method `at' called on terminated object 

이 코드 줄에 :

next if Hpricot(html).at('a') 

이 오류의 의미는 무엇입니까? 어떻게 피할 수 있습니까?

+0

'Hpricot (html)'의 결과를 매번 실행하지 않고 전체 루프 전에 변수에 지정하면이 문제가 발생합니까? –

+0

'html'은 루프 매개 변수입니다. 루프 앞에서'doc = Hpricot (html)'과 같은 일을 할 수는 있지만 * 루프 전에는 할 수 없습니다. * doc.at (' ')'. 나는 이것을 시도해 보겠다. –

답변

0

연결 문제 일 수 있습니다. 확장 프로그램을 두 번 연결하지 않았는지 확인하십시오.

+0

"확장 프로그램을 두 번 링크하라"는 말은 "확장 프로그램을 두 번 요구한다"는 뜻입니까? ('require'가 문제를 일으키지 않도록 고안된 것이 아닌가?) –

1

사용중인 라이브러리는 사용자 정의 C 확장을 사용합니다. C 확장에서 이미 가비지 수집 된 Ruby 객체의 메소드를 호출하려고합니다.

순수 루비에서는 가비지 수집기가 더 이상 참조에서 액세스 할 수없는 객체 만 해제하기 때문에 이러한 일이 발생하지 않습니다. 하지만 C에서, 가비지 컬렉터가 체크하지 않는 곳 (예를 들어, 컴파일러가 CPU 레지스터에 변수를 넣을 수 있음)에 Ruby 객체에 대한 참조가 남아있을 수 있습니다.

관련 문제