为什么不:=导出带有绑定的变量的值?
$ 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)
一个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 是一个编译时的东西,所以没有办法修改导出的东西.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |