Corso di Raku / Avanzato / Moduli

Introspezione dei moduli

Il nome di un modulo introduce un package — uno spazio dei nomi che contiene i nomi definiti al suo interno. In precedenza, nella sezione sui container, hai incontrato WHO, che restituisce lo Stash (la tabella dei simboli) di un package. L’introspezione dei moduli sfrutta proprio questo meccanismo.

Gli esempi seguenti utilizzano il modulo Greeting costruito nei capitoli precedenti — una subroutine esportata e una variabile our condivisa:

unit module Greeting;

our $version = '1.0';

sub hello($name) is export {
    return "Hello, $name!";
}

Il package di un modulo si scrive con :: finale. Aggiungendo .keys si ottiene l’elenco dei nomi che contiene:

use Greeting;

say Greeting::.keys.sort; # ($version EXPORT)

Il modulo Greeting dei capitoli precedenti definisce una variabile our, $version, quindi il suo package contiene quel nome — sigillo incluso. Accanto ad esso si trova EXPORT, che potrebbe sembrare inaspettato. Si tratta di un package che Raku crea automaticamente per contenere tutto ciò che un modulo contrassegna come is export, come la subroutine hello. Un nome esportato quindi non appare direttamente nel package; risiede all’interno di quel sotto-package EXPORT. (Le chiavi vengono restituite senza un ordine fisso, quindi l’esempio le ordina per ottenere un risultato stabile.)

Si può anche cercare un nome nel package usandolo come chiave. Questo raggiunge lo stesso valore del qualificato $Greeting::version:

use Greeting;

say Greeting::{'$version'}; # 1.0

Elencare ciò che un modulo esporta

Il package EXPORT visto sopra è dove risiedono effettivamente i nomi esportati, quindi è possibile elencarli guardando un livello più in profondità. Le esportazioni senza un tag finiscono nel gruppo DEFAULT (vedi Tag di esportazione), e le sue .keys sono le routine esportate:

use Greeting;

say Greeting::EXPORT::DEFAULT::.keys.sort; # (&hello)

Ogni chiave è un nome esportato con il suo sigillo — qui l’unica subroutine &hello, mostrata con il & che indica una routine. Questo è il modo per scoprire ciò che un modulo mette a disposizione dei suoi utenti senza leggerne il codice sorgente: basta chiedere al suo package EXPORT::DEFAULT cosa contiene.

Fare introspezione su un package in questo modo è utile quando si vuole scoprire cosa offre un modulo, o per raggiungere i suoi nomi in modo dinamico anziché scriverli uno per uno nel codice sorgente.

Pratica

Risolvi 1 quiz sul contenuto di questo argomento.

Esercizi

Questa sezione contiene 2 esercizi. Guarda tutti gli argomenti di questa sezione prima di iniziare gli esercizi.

  1. Elencare i simboli
  2. Cercare un simbolo

Soluzione: Caricare a runtime   |   Elencare i simboli