Курс по 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 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.
Навигация в курса
← Решение: Заредете по време на изпълнение | Изброете символите →