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上进行了相同的测试)
有什么东西了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 更一般的东西。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |