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

时间:2017-01-25 14:16:01

标签: perl6

给定模块文件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

1 个答案:

答案 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编译器发布后的几天内被合并到掌握中)