将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更通用的东西。

10-07 14:59