10

Perl6 文档声明“默认情况下,参数绑定到它们的参数并标记为只读。” 但运行以下代码:

# 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,而不是“绑定”。

4

1 回答 1

11

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在非容器上产生身份即可。

于 2019-06-22T12:54:23.950 回答