我很难理解在推送之后何时以及为什么推送的Scalar
容器所保存的值会受到影响。我将在两个风格化的示例中尝试说明我在更复杂的上下文中遇到的问题。
**示例1 *在第一个示例中,标量$i
被推到数组@b
上作为List
的一部分。推送后,使用$i++
指令在for循环的后续迭代中显式更新标量持有的值。这些更新会影响数组@b
中的值:在for循环的末尾,@b[0;0]
等于3
,而不再等于2
。
my @b;
my $i=0;
for 1..3 -> $x {
$i++;
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $x == 2 {
@b.push(($i,1));
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @b;
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
输出示例1:
Loose var $i: Scalar|94884317665520 139900170768608
Loose var $i: Scalar|94884317665520 139900170768648
Pushed $i : Scalar|94884317665520 139900170768648
Loose var $i: Scalar|94884317665520 139900170768688
Post for-loop
Array : [(3 1)]
Pushed $i : Scalar|94884317665520 139900170768688
*示例2 *在第二个示例中,标量$i
是循环变量。即使$i
在推送(现在是隐式而不是显式)后已更新,但数组$i
中的@c
的值也会not推送后更改;即,在for循环之后,它仍然是2
,而不是3
。
my @c;
for 1..3 -> $i {
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $i == 2 {
@c.push(($i,1));
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @c;
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;;
输出示例2:
Loose var $i: Scalar|94289037186864 139683885277408
Loose var $i: Scalar|94289037186864 139683885277448
Pushed $i : Scalar|94289037186864 139683885277448
Loose var $i: Scalar|94289037186864 139683885277488
Post for-loop
Array : [(2 1)]
Pushed $i : Scalar|94289037186864 139683885277448
问题:为什么在推后更新示例1中$i
中的@b
,而没有更新示例2中$i
中的@c
?
edit:在@timotimo的评论之后,我在示例中包括了.WHERE
的输出。这表明$i
的(WHICH /逻辑)标量身份保持不变,而其内存地址通过各种循环迭代而改变。但这并不能解释为什么在示例2中,推入的标量与旧地址(“ 448”)结合仍然与相同的WHICH身份绑定。
我很难理解在推送之后何时以及为什么推送的Scalar容器所持有的价值会受到影响。我将尝试在...
标量值是一个正义的容器。您可以将它们视为一种智能指针,而不是原始值。