是Perl 6中的导出和绑定

Eug*_*sky 6 perl6

为什么不:=导出带有绑定的变量的值?

$ cat myModule.pm6 
our $a is export = 42;
our $b is export := $a;

$ cat program.p6 
use myModule;
say $a;
say $b;

$ perl6 program.p6 
42
(Any)   # Why?
Run Code Online (Sandbox Code Playgroud)

Jon*_*ton 8

一个our-scoped变量实际上只是一个词法变量(如my) - 而不是Scalar每个范围新创建 - 通过绑定到Stash当前包中该名称的符号来初始化.这样有效:

our $foo;
Run Code Online (Sandbox Code Playgroud)

这样做:

my $foo := $?PACKAGE.WHO<$foo>;
Run Code Online (Sandbox Code Playgroud)

所以:

our $foo = 42;
Run Code Online (Sandbox Code Playgroud)

这样做:

(my $foo := $?PACKAGE.WHO<$foo>) = 42;
Run Code Online (Sandbox Code Playgroud)

因此重新绑定符号意味着它不再与Scalar存储在容器中的容器相关联Stash.

导出our-scoped变量会Scalar从变量绑定到的范围输入的存储区导出容器.因此,赋值分配到该导出的Scalar容器中.相比之下,绑定将词汇替换为完全不同且与导出的内容无关的词汇.

这就是为什么不允许导出my-scoped变量的原因:Scalar每个作用域条目都绑定一个fresh ,但是export 是一个编译时的东西,所以没有办法修改导出的东西.

  • @raiph我们当然可以警告说,绑定到`my`变量是对我们``的毫无意义的使用.如上所述,这里的问题不是特定于`export`. (2认同)