真的将参数绑定到参数吗? (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 上产生身份。
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 上产生身份。