Hai chiesto in un commento su Test::Most e in che modo riduce il boilerplate. Guarda il suo metodo import
. Sta caricando i moduli nel suo spazio dei nomi, aggiungendo tali simboli a @EXPORT
, quindi richiamando un altro import
attraverso un goto
per ottenerli infine nello spazio dei nomi di chiamata. È una seria magia nera che Curtis sta succedendo lì, anche se mi chiedo perché non abbia usato qualcosa come import_to_level. Forse ci sono alcuni effetti collaterali a cui non sto pensando.
parlo un po 'su questo genere di cose in Avoid accidently creating methods from module exports in The Effective Perler. È in un contesto diverso ma sono alcuni degli stessi problemi.
Ecco un esempio diverso.
Se un altro modulo carica un modulo, è possibile accedervi. Non è bello dipendere da questo però. Qui ci sono tre file separati:
Top.pm
use 5.010;
package Top;
use File::Spec;
sub announce { say "Hello from top!" }
1;
Bottom.pm
package Bottom;
use parent qw(Top);
sub catfiles { File::Spec->catfile(@_) }
1;
test.pl
use 5.010;
use Bottom;
say Bottom->catfiles(qw(foo bar baz));
say File::Spec->catfile(qw(one two three));
Carico solo file :: Spec in Top.pm. Tuttavia, una volta caricato, posso utilizzarlo ovunque nel mio programma Perl. L'output mostra che ho potuto "usare" il modulo in altri file anche se ho caricato solo in uno:
Bottom/foo/bar/baz
one/two/three
A questo scopo, la parte del codice che carica il modulo deve caricare prima qualsiasi altra parte del codice tenta di utilizzare quel modulo. Come ho detto, è una cattiva idea dipendere da questo: le cose si rompono se la sequenza di caricamento cambia o il modulo di caricamento scompare.
Se si desidera importare simboli, tuttavia, è necessario caricare in modo esplicito il modulo desiderato mentre si è nel pacchetto in cui si desidera eseguire l'importazione. Questo è solo il modo in cui il modulo di esportazione definisce i simboli in quel pacchetto. Non è qualcosa che dipende dalla portata.
fonte
2010-08-11 17:01:49
Chiedo informazioni su questa funzionalità perché Test :: Most e Moose dichiarano di farlo, ma non ho capito come lo fanno. – chotchki
Esaminare il metodo import() in Test :: Most. Ecco come funziona Carica manualmente tutti i moduli boilerplate e li esporta di due livelli. –
Grazie a tutti per l'aiuto di tutti! Il sub di importazione era la chiave. (Potrei solo salvarmi il dolore futuro e andare ad Alci). – chotchki