Raku-Kurs / Fortgeschritten / Module

Modul-Introspektion

Der Name eines Moduls führt ein Package ein — einen Namensraum, der die darin definierten Namen enthält. Früher, im Abschnitt über Container, hast du WHO kennengelernt, das den Stash (die Symboltabelle) eines Packages zurückgibt. Modul-Introspection macht davon Gebrauch.

Die folgenden Beispiele verwenden das Greeting-Modul, das in den vorherigen Themen aufgebaut wurde — eine exportierte Subroutine und eine gemeinsam genutzte our-Variable:

unit module Greeting;

our $version = '1.0';

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

Das Package eines Moduls wird mit einem nachgestellten :: geschrieben. Mit .keys listest du die darin enthaltenen Namen auf:

use Greeting;

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

Das Greeting-Modul aus den vorherigen Themen definiert eine our-Variable, $version, sodass sein Package diesen Namen enthält — einschließlich des Sigils. Daneben befindet sich EXPORT, was überraschend wirken mag. Es ist ein Package, das Raku automatisch erstellt, um alles aufzunehmen, was ein Modul mit is export markiert, wie die Subroutine hello. Ein exportierter Name erscheint daher nicht direkt im Package; er befindet sich innerhalb dieses EXPORT-Unter-Packages. (Die Schlüssel kommen in keiner festen Reihenfolge zurück, daher sortiert das Beispiel sie für ein stabiles Ergebnis.)

Du kannst einen Namen auch im Package nachschlagen, indem du ihn als Schlüssel verwendest. Dies erreicht denselben Wert wie das qualifizierte $Greeting::version:

use Greeting;

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

Auflisten, was ein Modul exportiert

Das oben gezeigte EXPORT-Package ist der Ort, an dem die exportierten Namen tatsächlich liegen. Du kannst sie auflisten, indem du eine Ebene tiefer schaust. Exporte ohne Tag gehen in die DEFAULT-Gruppe (siehe Export-Tags), und ihre .keys sind die exportierten Routinen:

use Greeting;

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

Jeder Schlüssel ist ein exportierter Name mit seinem Sigil — hier die einzelne Subroutine &hello, dargestellt mit dem &, das eine Routine kennzeichnet. So kannst du herausfinden, was ein Modul seinen Nutzern zur Verfügung stellt, ohne dessen Quellcode zu lesen: Frage sein EXPORT::DEFAULT-Package, was es enthält.

Ein Package auf diese Weise zu inspizieren ist praktisch, wenn du herausfinden möchtest, was ein Modul bereitstellt, oder wenn du seine Namen dynamisch erreichen willst, anstatt jeden einzeln im Quellcode auszuschreiben.

Praxis

Lösen Sie 1 Quiz zum Inhalt dieses Themas.

Übungen

Dieser Abschnitt enthält 2 Übungen. Sehen Sie sich alle Themen dieses Abschnitts an, bevor Sie mit den Übungen beginnen.

  1. Die Symbole auflisten
  2. Ein Symbol nachschlagen

Kursnavigation

Lösung: Zur Laufzeit laden   |   Die Symbole auflisten