Курс по Raku / Напреднали / Модули

Интроспекция на модули

Името на модула въвежда пакет — пространство от имена, което съдържа дефинираните в него имена. По-рано, в раздела за контейнерите, се запознахте с WHO, който връща Stash (таблицата със символи) на пакета. Интроспекцията на модули използва именно това.

Примерите по-долу използват модула Greeting, изграден в предишните теми — експортирана подпрограма и споделена our променлива:

unit module Greeting;

our $version = '1.0';

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

Пакетът на модул се записва с :: в края. Добавянето на .keys изброява съдържащите се в него имена:

use Greeting;

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

Модулът Greeting от предишните теми дефинира our променлива $version, така че пакетът му съдържа това име — включително сигила. До нея стои EXPORT, което може да изглежда изненадващо. Това е пакет, който Raku създава автоматично, за да съхранява всичко, маркирано с is export, като подпрограмата hello. Следователно експортираното име не се появява директно в пакета — то се намира във вътрешния подпакет EXPORT. (Ключовете се връщат в произволен ред, затова примерът ги сортира за стабилен резултат.)

Можете също да потърсите име в пакета, като го използвате като ключ. Така достигате същата стойност като квалифицираната $Greeting::version:

use Greeting;

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

Изброяване на експортите на модул

Пакетът EXPORT, показан по-горе, е мястото, където действително се намират експортираните имена, така че можете да ги изброите, като погледнете едно ниво по-навътре. Експортите без таг попадат в групата DEFAULT (вижте Тагове за експортиране), а .keys показва експортираните подпрограми:

use Greeting;

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

Всеки ключ е експортирано име с неговия сигил — тук единствената подпрограма &hello, показана със &, което маркира подпрограма. Така можете да разберете какво предоставя модулът на своите потребители, без да четете изходния му код: попитайте пакета EXPORT::DEFAULT какво съдържа.

Интроспекцията на пакет по този начин е удобна, когато искате да откриете какво предоставя даден модул, или да достигнете до имената му динамично, вместо да ги записвате едно по едно в изходния код.

Практика

Направете 1 тест върху съдържанието на тази тема.

Упражнения

Този раздел съдържа 2 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.

  1. Изброете символите
  2. Потърсете символ

Навигация в курса

Решение: Заредете по време на изпълнение   |   Изброете символите