是否应该自动导入模块文件中的常量?

Chr*_*oms 8 perl6

给定模块文件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编译器发布后的几天内被合并到掌握)