Курс 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. Знайти символ

Навігація курсом

Розв’язання: Завантажити під час виконання   |   Перелічити символи