将元素添加到循环内声明为“状态%set为SetHash [Str]”的SetHash中时引发的异常

850*_*850 6 perl6 sethash raku

将Str元素添加到声明为state %set is SetHash[Str]在循环内的SetHash中会引发异常:

无法解析调用方STORE(SetHash [Str]:U:SetHash [Str]:D); 这些签名都不匹配:

(SetHash:D:* @ pairs,*%_-> SetHash:D)

(SetHash:D:\ objects,\ bools,*%_-> SetHash:D)

(QuantHash:D:|)

当在循环之前声明为my %set is SetHash[Str]相同的代码就可以了。

根据https://docs.raku.org/type/SetHash#Creating_SetHash_objects

...

从6.d(2019.03及更高版本)开始,还可以指定要在SetHash中允许的值的类型。

这可以在调用.new时完成:

#only allow Pairs

my $n = SetHash[Pair].new: "zero" => 0, "one" => 1, "two" => 2;

或使用伪装语法:

#only allow strings

my %sh is SetHash[Str] = <a b c>;

say %sh<a>; # True

say %sh<d>; # False

...

当声明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
Run Code Online (Sandbox Code Playgroud)

什么不是:

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
Run Code Online (Sandbox Code Playgroud)

这是为什么?这是错误吗?

(在Rakudo 2019.07.1和2019.03上进行了相同的测试)

rai*_*iph 6

有什么东西了is Foo一个state声明。

例如,参见[BUG] state% is SetHash其第二个条目以block结束时带有类型对象

我记得还必须写:

my @array is BigArray;
proto A(Int \, Int \) { @array[][] //= {*} }
Run Code Online (Sandbox Code Playgroud)

代替

proto A(Int \, Int \) { (state @array is BigArray)[][] //= {*} }
Run Code Online (Sandbox Code Playgroud)

前阵子,所以我认为还有一些比SetHashs 更一般的东西。