【问题标题】:Really binding an argument to a parameter? (Perl6)真的将参数绑定到参数吗? (Perl6)
【发布时间】:2019-11-05 00:21:45
【问题描述】:
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
我不明白的是 Example1 的输出中的 (Scalar):当我应该将 Int 1 - 参数绑定到标识符 $x 时,为什么会有一个标量?似乎值1 被“分配”给$x,而不是“绑定”。
【问题讨论】:
标签:
variable-assignment
raku
variable-binding
【解决方案1】:
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 只是在非容器上产生身份。