【发布时间】:2019-08-20 21:29:11
【问题描述】:
似乎动态变量并不总是能够在线程中的子例程调用中存活:
sub foo($x, &y = &infix:<+>) {
my &*z = &y;
bar($x);
}
sub bar ($x) {
say &*z($x,$x);
my $promise = start { bar($x-1) if $x > 0 }
await $promise;
# bar($x-1) if $x > 0 # <-- provides the expected result: 6, 4, 2, 0
}
foo(3); # 6, 4, Dynamic variable &*z not found
使用更全局范围的变量也可以,所以并不是所有变量都丢失了——它似乎是动态特性所特有的:
our &b;
sub foo($a, &c = &infix:<+>) {
&b = &c;
bar($a);
}
sub bar ($a) {
say &b($a,$a);
my $promise = start { bar($a-1) if $a > 0 }
await $promise;
}
foo(3); # 6, 4, 2, 0
一旦在foo() 中设置了变量,就可以在bar() 中毫无问题地读取它。但是当 bar() 从 promise 内部调用时,&*z 的值不是在第一层递归而是在第二层消失。
我感觉到了一个错误,但也许我在递归/动态变量/线程之间做了一些奇怪的事情,这把事情搞砸了。
【问题讨论】:
标签: multithreading raku