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