Perché non può il mio Perl oggetto trova la sua skip() metodo, anche se posso chiamare una subroutine?
-
16-09-2019 - |
Domanda
Sto lavorando su un modulo Perl e ogni volta che chiamo il skip()
il metodo che ho scritto nel modo seguente:
$cursor->skip(4);
Ottengo:
Undefined subroutine &MyModule::Cursor::skip called at t/tester.pl line 24. (in cleanup) invalid object at t/tester.pl line 24.
Quando mi chiamano come:
MyModule::Cursor::skip($cursor, 4);
Perl la trova!
Stranamente, anche se ho un nome "skip
"tutto il resto ("skipper
", "hello
"), questa sintassi funziona:
$cursor->skipper(4);
Ho pensato che forse skip()
era un "segreto" riservata la parola chiave o qualcosa del genere, ma ho anche metodi denominati sort()
e next()
(so che sono riservati), e quelli che lavorano bene.
Mi piacerebbe molto il nome di questo metodo "skip
." Qualcuno sa perché il Perl non riesco a trovarlo?
Soluzione
skip()
viene esportato da Test::More
, che si potrebbe aver caricato dal vostro eseguibile è chiamato t/tester.pl
.
Che cosa significa ref($cursor)
cedere voi? Dovrebbe essere un oggetto MyModule::Cursor
benedetta, ma l'errore "invalid object
" potrebbe suggerire l'oggetto non è stato costruito in modo corretto.
EDIT: perldiag dà un altro indizio: "in cleanup
" significa che un problema è stato riscontrato da distruttore dell'oggetto. Dando per scontato che non si dispone già di un distruttore nell'oggetto, creare un metodo che MyModule::Cursor::DESTROY
Data::Dump
s l'oggetto per vedere come appare in questo momento.
Un frammento concisa esempio di codice che presenta questo comportamento sarebbe molto utile.
Altri suggerimenti
Senza il codice vero e proprio, è difficile eseguire il debug di questo.
Si utilizzare Miomodulo::Cursore nel codice di test?Quando è stato sostituito saltare con skipper, ti ha chiamata in esattamente allo stesso modo, dal tuo modulo di test?Siete in grado di utilizzare saltare da un usa-e-getta (one-liner o molto breve script)?
Dove sto andando con questo, è alla ricerca per un errore nel codice di test, piuttosto che il modulo.
AGGIORNAMENTO: Non stai facendo qualcosa di simile a dichiarare metodi Miomodulo::Cursore in due file diversi, e tu?Il messaggio di errore che stai ricevendo mi dice che ha un beato riferimento a un oggetto di tipo Miomodulo::Cursore, così conosce la classe;ma quindi non è possibile trovare la definizione di saltare.Ti capita di dichiarare parte di Miomodulo::Cursore in un unico file, e saltare in un altro, e il modulo di verifica non è compreso il secondo file?O non si dispone di un errore di sintassi da qualche parte intorno la tua definizione di saltare -- manca un punto e virgola o spaiati parentesi graffa?(Ma poi di nuovo, perché Miomodulo::Cursore::salta lavoro dove $cursore->salta non?)