2017-01-25 3 views
8

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

ответ

11

Это не ошибка. Константы: our по умолчанию, а ваша константа в test.pm6 по-прежнему находится в магистрали и поэтому помещается в пространство имен GLOBAL, и так как это our, это видно в вашем основном скрипте.

Один из способов избежать этого - то, что вы нашли: использовать my на константах/классах (по умолчанию они равны our). Или, наоборот, использовать our для подпрограмм/переменных, которые вы хотите сделать видимыми (в качестве подстановок по умолчанию - my).

Другой способ заключается в использовании, скажем, unit module BlahBlah; в верхней части файла модуля, а затем эти символы будут в BlahBlah имен, а не в GLOBAL и поэтому не будут видны в главном скрипте непосредственно (our символы могут по-прежнему доступны как BlahBlah::whatever)

PS: те, в 2016 году Rakudos не будет наблюдать такое поведение из-за lexical module loading bug, который получил неподвижную только в 2017.01 выпуске компилятора (и был присоединен освоить пару дней после выхода 2016,12 компилятора)

+0

Какая связь между 'our' и' is export'? –

+0

@BradClawsie, вероятно, мало, так как 'is export' code наполняет все символы в импортирующий пакет, тогда как' our' делает вещи в пакетах. Что именно это означает при использовании в магистрали отдельного файла ... Я не уверен на 100%. Я пробовал пинговать двух людей, которые знали бы, но они были AFK :) Ответ также может быть немного неправильным. Когда я сбрасываю GLOBAL, я не вижу константы там, а вместо этого в 'MY'. И модули этого не видят, если я не буду использовать файл с константой в них. –

+0

@BradClawsie, ah, nm, я получил объяснение недостающих частей: он не отображается во всех модулях из-за предварительной компиляции, а также для загрузки лексического модуля (поэтому символ заканчивается в 'MY ::' вместо ' GLOBAL'). –

Смежные вопросы