ozz*_*zzy 10 variable-assignment perl6 variable-binding
该Perl6文档状态“默认情况下,参数绑定到他们的说法,并标记为只读。” 但是运行以下代码:
# Example 1
sub f1 ( $x ) { say $x.VAR.WHAT; say $x.WHAT; say $x }
f1(1);
Run Code Online (Sandbox Code Playgroud)
产量:
(Scalar)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
而这段代码:
# Example 2
my $y := 1;
say $y.VAR.WHAT; say $y.WHAT; say $y;
Run Code Online (Sandbox Code Playgroud)
产量:
(Int)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
这(Scalar)是我不理解的Example1的输出:我应该将Int 1参数绑定到标识符时,为什么会有标量$x?似乎该值已1“分配”给$x,而不是“绑定”了。
Jon*_*ton 11
Scalar容器还用于指示物品,从而防止物品变平。在没有类型约束的情况下,实现会将输入的参数保守地包装到只读Scalar容器中,以避免发生任何意外的展平。对比一下:
sub foo($x) {
my @a = $x;
say @a.elems;
}
foo([1,2,3]);
Run Code Online (Sandbox Code Playgroud)
输出为1(不展平),并且没有sigiling绑定:
sub foo(\x) {
my @a = x;
say @a.elems;
}
foo([1,2,3])
Run Code Online (Sandbox Code Playgroud)
由于未施加项目上下文,因此输出3。如果Scalar容器不在那里,两者都将输出3。
在存在非Iterable类型约束的情况下,将省略此包装。因此写:
sub f1(Int $x) {
say $x.VAR.WHAT;
say $x.WHAT;
say $x
}
f1(1)
Run Code Online (Sandbox Code Playgroud)
将输出:
(Int)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
通过.VAR简单地在非容器上产生身份。