Действительно привязка аргумента к параметру? (Perl6) - PullRequest
10 голосов
/ 22 июня 2019

Состояние Perl6 docs"По умолчанию параметры привязаны к своему аргументу и помечены как доступные только для чтения." Но работает следующий код:

# Example 1
sub f1 ( $x ) { say $x.VAR.WHAT; say $x.WHAT; say $x }
f1(1);

Выходы:

(Scalar)
(Int)
1

пока этот код:

# Example 2
my $y := 1;
say $y.VAR.WHAT; say $y.WHAT; say $y;

Выходы:

(Int)
(Int)
1

Это - (Scalar) в выходных данных Example1, которые я не понимаю: почему существует скаляр, когда я предположительно связываю аргумент Int 1 с идентификатором $x? Кажется, что значение 1 присвоено $x, а не «привязано».

1 Ответ

11 голосов
/ 22 июня 2019
Контейнеры

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

sub foo($x) {
    my @a = $x;
    say @a.elems;
}
foo([1,2,3]);

Который выводит 1 (без выравнивания) с привязкой без сигил:

sub foo(\x) {
    my @a = x;
    say @a.elems;
}
foo([1,2,3])

Который выводит 3, так как контекст элемента не накладывается.Если бы контейнер Scalar отсутствовал, оба выдали бы 3.

При наличии ограничения, отличного от Iterable, эта упаковка будет опущена.Таким образом, запись:

sub f1(Int $x) {
    say $x.VAR.WHAT;
    say $x.WHAT;
    say $x
}
f1(1)

Будет выводить:

(Int)
(Int)
1

С .VAR просто выдачей идентификатора для не контейнера.

...