真的将参数绑定到参数吗? (Perl6)

Really binding an argument to a parameter? (Perl6)

Perl6 docs状态"By default, parameters are bound to their argument and marked as read-only."但是运行下面的代码:

# 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

我不明白的是 Example1 输出中的 (Scalar):当我理应将 Int 1 - 参数绑定到标识符 $x 时,为什么会有标量?似乎值 1 得到了 "assigned" 到 $x,而不是 "bound"。

Scalar 容器也用于指示物品,从而防止物品被压扁。在没有类型约束的情况下,实现会将传入参数保守地包装到 read-only 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 简单地在 non-container 上产生身份。