2011-01-13 27 views
6

kỳ tôi nhận được ngoại lệ này:"Đối tượng đã kết thúc" là gì và tại sao tôi không thể gọi các phương thức trên đó?

NotImplementedError: method `at' called on terminated object 

trên dòng mã này:

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

lỗi này có nghĩa gì? Làm thế nào tôi có thể tránh nó?

+0

Điều đó cũng xảy ra nếu bạn gán kết quả 'Hpricot (html)' cho một biến trước toàn bộ vòng lặp thay vì thực hiện nó mỗi lần? –

+0

'html' là tham số vòng lặp, vì vậy tôi không thể làm điều đó * trước * vòng lặp, mặc dù tôi có thể làm một cái gì đó như' doc = Hpricot (html) 'ở đầu vòng lặp và làm' doc.at (' a ') '. Tôi sẽ cung cấp cho một thử này –

Trả lời

0

Đây có thể là sự cố liên kết. Kiểm tra xem bạn đã không liên kết tiện ích mở rộng hai lần chưa.

+0

Bởi "liên kết phần mở rộng hai lần", bạn có nghĩa là "' yêu cầu' phần mở rộng hai lần "? (Không phải là 'yêu cầu' được thiết kế để đảm bảo điều này không gây ra vấn đề?) –

1

Thư viện bạn đang sử dụng sử dụng tiện ích mở rộng C tùy chỉnh. Trong phần mở rộng C, nó đang cố gắng gọi một phương thức trên một đối tượng Ruby đã được thu gom rác.

Điều này không thể xảy ra trong Ruby thuần khiết, vì bộ thu gom rác sẽ chỉ giải phóng các đối tượng không còn truy cập được từ bất kỳ tham chiếu nào. Nhưng trong C, có thể có một tham chiếu còn lại đối với một đối tượng Ruby, ở nơi mà bộ thu gom rác không kiểm tra (ví dụ, trình biên dịch có thể đã đặt một biến trong một thanh ghi CPU).

Các vấn đề liên quan