将Str元素添加到循环内声明为state %set is SetHash[Str]
的SetHash中会引发异常:
当在循环之前声明为my %set is SetHash[Str]
时,相同的代码也可以正常工作。
根据https://docs.raku.org/type/SetHash#Creating_SetHash_objects:
当声明HashSet的前一种方式(%set = SetHash[Str].new
)时,它按预期方式工作(在循环之前或循环之内)。
问题恰恰与后者有关。
什么有效:
use v6.d;
my @list = 'aaa' .. 'ddd';
my %set is SetHash[Str];
for @list {
%set{$_}++ if m/a.*a/;
LAST {
put %set.elems;
}
}
#outputs 10
什么不是:use v6.d;
my @list = 'aaa' .. 'ddd';
for @list {
state %set is SetHash[Str];
%set{$_}++ if m/a.*a/;
LAST {
put %set.elems;
}
}
#outputs the exception
这是为什么?这是一个错误吗?(在Rakudo 2019.07.1和2019.03上进行了相同的测试)
最佳答案
is Foo
声明中的state
有一些问题。
参见,例如[BUG] state
with % is SetHash
ends up with a type object on second entry to block。
我记得还必须写:
my @array is BigArray;
proto A(Int \𝑚, Int \𝑛) { @array[𝑚][𝑛] //= {*} }
代替
proto A(Int \𝑚, Int \𝑛) { (state @array is BigArray)[𝑚][𝑛] //= {*} }
前阵子,所以我认为还有一些比
SetHash
更通用的东西。