2011-01-13 6 views
6

Periodicamente ottengo questa eccezione:Che cos'è un "oggetto terminato" e perché non posso richiamare i metodi su di esso?

NotImplementedError: method `at' called on terminated object 

su questa linea di codice:

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

Che cosa significa questo errore? Come posso evitarlo?

+0

Accade anche se assegni il risultato di 'Hpricot (html)' a una variabile prima dell'intero ciclo invece di eseguirlo ogni volta? –

+0

'html' è il parametro del ciclo, quindi non posso farlo * prima * del ciclo, anche se potrei fare qualcosa come' doc = Hpricot (html) 'all'inizio del ciclo e fare' doc.at (' un ') '. Darò questo un tentativo –

risposta

0

Potrebbe trattarsi di un problema di collegamento. Verifica di non aver collegato l'estensione due volte.

+0

Per "collegare l'estensione due volte", intendi "richiede l'estensione due volte"? (Non è necessario 'require' progettato per assicurarsi che questo non causi problemi?) –

1

La libreria in uso utilizza un'estensione C personalizzata. Nell'estensione C, sta provando a chiamare un metodo su un oggetto Ruby che è già stato raccolto dalla garbage collection.

Questo non può accadere in puro Rubino, perché il garbage collector libererà solo oggetti che non sono più accessibili da qualsiasi riferimento. Ma in C, è possibile avere un riferimento che rimane a un oggetto Ruby, in un punto che il garbage collector non controlla (per esempio, il compilatore potrebbe aver inserito una variabile in un registro CPU).