Константы в файлах модуля должны импортироваться автоматически?
Учитывая файл модуля test.pm6
:
constant $AUTHOR='me';
И сценарий test_script.p6
:
use lib '.';
use test;
my $AUTHOR = 'someone';
Я получаю следующее предупреждение при компиляции чека test_script.p6
:
perl6 -c test_script.p6
Potential difficulties:
Redeclaration of symbol '$AUTHOR'
at test_script.p6:5
------> my $AUTHOR⏏ = 'someone';
Syntax OK
Однако просто меняется test.pm6
одно из следующих действий делает это предупреждение исчезающим:
my $AUTHOR='me';
или же
my constant $AUTHOR='me';
Итак, вопрос в том, должны ли константы импортироваться автоматически или это ошибка?
Для этого используется Rakudo Star 2017.01 Release Candidate 0, установленный в CentOS Linux версии 7.3.1611 (Core).
1 ответ
Это не ошибка. Константы our
по умолчанию и ваша константа в test.pm6
все еще находится в магистрали и поэтому помещается в GLOBAL
пространство имен и так как это our
это видно в вашем основном скрипте.
Один из способов избежать этого - то, что вы нашли: использовать my
на константы / классы (поскольку они по умолчанию our
). Или наоборот, чтобы использовать our
в подпрограммах / переменных, которые вы хотите сделать видимыми (в качестве подпрограмм по умолчанию my
).
Другой способ заключается в использовании, скажем, unit module BlahBlah;
в верхней части вашего файла модуля, а затем эти символы будут в BlahBlah
пространство имен, а не в GLOBAL
и так не будет видно в основном скрипте напрямую (our
символы все еще могут быть доступны как BlahBlah::whatever
)
PS: в Rakudos 2016 года такого поведения не будет наблюдаться из-за ошибки загрузки лексического модуля, которая была исправлена только в выпуске компилятора 2017.01 (и была объединена для освоения через пару дней после выпуска компилятора 2016.12)