Perché non può il mio Perl oggetto trova la sua skip() metodo, anche se posso chiamare una subroutine?

StackOverflow https://stackoverflow.com/questions/1280225

  •  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?

È stato utile?

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::Dumps 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?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top