gpt4 book ai didi

variable-assignment - 动态变量、CALLERS、标量和赋值

转载 作者:行者123 更新时间:2023-12-04 11:09:44 30 4
gpt4 key购买 nike

我最近注意到,在使用赋值的大多数情况下,重新初始化动态变量没有我预期的语义(但是,绑定(bind)以我预期的方式工作)。
具体来说,在这段代码中:

sub g {
my $*i = CALLERS::<$*i> // 0;
my $*a1 = CALLERS::<$*a1> // Array.new;
my @*a2 = CALLERS::<@*a2> // Array.new;
$*i++;
$*a1.push: 'v1';
@*a2.push: 'v2';
dd $*i;
dd $*a1;
dd @*a2;
}
sub f {
my $*i = 0;
my $*a1 = Array.new;
my @*a2 = Array.new;
g; g; g;
}
f
我期望输出 3 , ["v1", "v1", "v1"] , 和 ["v2", "v2", "v2"]而是得到 1 , $["v1", "v1", "v1"] , ["v2"] .切换到绑定(bind)解决了这个问题,所以我没有试图解决问题——但我非常想了解为什么赋值在这里不起作用。我注意到指向 Array 的 Scalar 有效,但指向 Int 的 Scalar 无效。但无论哪种情况,我都会认为新分配的变量会从 CALLERS 接收值。我对赋值的语义遗漏了什么?

最佳答案

What am I missing about the semantics of assignment?


我认为您所缺少的与动态变量本身没有任何关系。我认为你缺少的是这样一个事实:
my @a = Array.new;
基本上是一个 noop。由于单参数规则,它与以下内容相同:
my @a = ();
这与:
my @a;
所以,在你的例子中 sub f , 这:
my @*a2 = Array.new;
in 只是在动态变量中设置一个空数组。
然后在 sub g这:
my @*a2 = CALLERS::<@*a2> // Array.new;
基本上只是在做(因为单参数规则):
my @*a2;
因此你看不到 push es 你以前做过,因为每次调用都是新鲜的。
关于 $*i的值在 sub g :这也只是增加了调用者的副本 $*i ,所以值保持在 1在每次通话中。
原因 $*a1有效,是容器化停止了单参数规则的扁平化行为。观察两者之间的区别:
sub a(+@a) { dd @a }; a [2,3,4];  # [2,3,4]
和:
sub a(+@a) { dd @a }; a $[2,3,4];  # [[2,3,4],]

关于variable-assignment - 动态变量、CALLERS、标量和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67831051/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com