给定模块文件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(Core)上安装的Rakudo Star 2017.01 Release Candidate 0.
这不是一个错误.our
默认情况下,常量是作用域的,你的常量test.pm6
仍然在主线中,因此放入GLOBAL
命名空间,因为它是一个our
,它在主脚本中可见.
避免它的一种方法是你发现:使用my
on常量/类(默认为our
).或者相反,使用our
要使其可见的on子例程/变量(作为subs默认值my
).
另一种方法是使用,比如说,unit module BlahBlah;
在模块文件的顶部,然后这些符号将在BlahBlah
命名空间中,而不是在GLOBAL
主菜单中直接可见(our
符号仍然可以访问BlahBlah::whatever
)
PS:2016年Rakudos上的那些因为词汇模块加载错误而不会观察到这种行为,这个错误仅在2017.01编译器版本中得到修复(并且在2016.12编译器发布后的几天内被合并到掌握)