Курс языка программирования 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. Поиск символа

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

Решение: Загрузка во время выполнения   |   Список символов