экспортно-переплетный в Perl 6 - PullRequest
0 голосов
/ 18 октября 2018

Почему не экспортируется значение переменной с привязкой :=?

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

1 Ответ

0 голосов
/ 18 октября 2018

Переменная our -области - это на самом деле просто лексическая переменная (например, my), которая вместо Scalar, только что созданного для каждой области действия, - инициализируется связыванием с символом этого имени в Stash текущего пакета.Так эффективно это:

our $foo;

Делает это:

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

И так:

our $foo = 42;

Делает это:

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

Повторная привязка символа, таким образом, означает, что он больше не связан с контейнером Scalar, хранящимся в Stash.

При экспорте переменной с областью our экспортируется контейнер Scalar из тайника, в который переменнаясвязан с временем входа в область.Таким образом, назначение присваивается этому экспортированному контейнеру Scalar.В отличие от этого, связывание заменяет лексическое на что-то совершенно другое и не связанное с тем, что было экспортировано.

Вот почему вы не можете экспортировать my -объектную переменную: свежая Scalar связана с каждымзапись в области видимости, но экспорт - вещь времени компиляции, поэтому не было бы никакого способа изменить экспортируемую вещь.

...