给定模块文件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';
所以,问题是应该自动导入常量还是这个bug?
这是在CentOS Linux 7.3.1611版(核心版)上安装的Rakudo Star 2017.01 Release Candidate 0。
答案 0 :(得分:11)
这不是错误。默认情况下常量为our
范围,test.pm6
中的常量仍位于主线中,因此放入GLOBAL
命名空间,因为它是our
,它在您的显示中可见主要脚本。
避免它的一种方法是你发现:在常量/类上使用my
(因为它们默认为our
)。或者相反,对要使其显示的子例程/变量使用our
(作为默认为my
的子集)。
另一种方法是在模块文件的顶部使用unit module BlahBlah;
,然后这些符号将位于BlahBlah
命名空间中,而不是GLOBAL
中,因此不会直接在主脚本中显示(our
符号仍然可以作为BlahBlah::whatever
)
P.S。:2016年Rakudos上的那些人不会因为lexical module loading bug而发现这种行为,{{3}}仅在2017.01编译器版本中得到修复(并且在2016.12编译器发布后的几天内被合并到掌握中)