Константы в файлах модуля должны импортироваться автоматически?

Учитывая файл модуля 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)

Другие вопросы по тегам