给定模块文件test.pm6:
constant $AUTHOR='me';
Run Code Online (Sandbox Code Playgroud)
和剧本test_script.p6:
use lib '.';
use test;
my $AUTHOR = 'someone';
Run Code Online (Sandbox Code Playgroud)
我编译检查时收到以下警告test_script.p6:
perl6 -c test_script.p6
Potential difficulties:
Redeclaration of symbol '$AUTHOR'
at test_script.p6:5
------> my $AUTHOR? = 'someone';
Syntax OK
Run Code Online (Sandbox Code Playgroud)
但是,只需更改test.pm6为以下之一就会使此警告消失:
my $AUTHOR='me';
Run Code Online (Sandbox Code Playgroud)
要么
my constant $AUTHOR='me';
Run Code Online (Sandbox Code Playgroud)
那么,问题是应该自动导入常量还是这个bug?
这是使用在CentOS Linux版本7.3.1611(Core)上安装的Rakudo Star 2017.01 Release Candidate 0.
小智 11
这不是一个错误.our默认情况下,常量是作用域的,你的常量test.pm6仍然在主线中,因此放入GLOBAL命名空间,因为它是一个our,它在主脚本中可见.
避免它的一种方法是你发现:使用myon常量/类(默认为our).或者相反,使用our要使其可见的on子例程/变量(作为subs默认值my).
另一种方法是使用,比如说,unit module BlahBlah;在模块文件的顶部,然后这些符号将在BlahBlah命名空间中,而不是在GLOBAL主菜单中直接可见(our符号仍然可以访问BlahBlah::whatever)
PS:2016年Rakudos上的那些因为词汇模块加载错误而不会观察到这种行为,这个错误仅在2017.01编译器版本中得到修复(并且在2016.12编译器发布后的几天内被合并到掌握)