我可以检查对数组的键/值的类型吗?

EZM*_*EZM 9 raku

我需要创建一个带有键/值的数据结构来维护顺序。哈希值不保持顺序,因此我使用的是成对的数组。一切都按预期进行。但是,我想在将其添加到数组之前检查每对的类型。该对应始终为 Str => Int。

[0] >  my Pair @list
[1] >  @list.push: "Roma" => 1                                                 
[Roma => 1]
[2] >  @list.push: "Paris" => 2                                                
[Roma => 1 Paris => 2]
[3] >  @list.push: "Lisboa" => 3                                               
[Roma => 1 Paris => 2 Lisboa => 3]
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似的东西my Int %list{Str}。任何想法?。

Jon*_*ton 11

它没有语法快捷方式,但您可以通过声明一个约束and of 的subset类型来实现,如下所示:keyvaluePair

[0] > subset PairStrInt of Pair where .key ~~ Str && .value ~~ Int;
(PairStrInt)
[1] > my PairStrInt @list;
[]
[2] > @list.push: "Roma" => 1
[Roma => 1]
[3] > @list.push: "Paris" => "2"           
Type check failed for an element of @list; expected PairStrInt but got Pair (:Paris("2"))
  in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)

  • 我对代码正在做什么的直觉,加上一些对健全性测试的粗略测试,建议我将 `where` 子句更改为 `:(Str :$key, Int :$value)` (这是一个 [signature]( https://docs.raku.org/type/Signature)对“Pair”对象进行对象解构)通常会或至少可能比“.key ~~ Str &amp;&amp; .value ~~ Int”执行得更快。 (4认同)