首页 > 解决方案 > 在 Perl 6 中是导出和绑定

问题描述

:=为什么没有导出具有绑定的变量的值?

$ 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?

标签: raku

解决方案


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

our $foo;

正在这样做:

my $foo := $?PACKAGE.WHO<$foo>;

所以:

our $foo = 42;

正在这样做:

(my $foo := $?PACKAGE.WHO<$foo>) = 42;

因此,重新绑定符号意味着它不再与Scalar存储在Stash.

导出一个our-scoped 变量会Scalar从该变量在范围进入时绑定到的存储中导出容器。因此,分配分配到该导出的Scalar容器中。相比之下,绑定将词汇替换为完全不同且与导出的内容无关的东西。

这就是为什么不允许导出my-scoped 变量的原因:Scalar每个范围条目都绑定了一个新变量,但导出是编译时的事情,因此无法修改导出的内容。


推荐阅读