如何在Perl 6中声明数字哈希值的哈希?

时间:2018-07-01 14:01:05

标签: perl6

默认情况下,哈希将所有键转换为字符串。当您的密钥是可能接近的数字时,这会导致问题:

> my %h; %h{1/3} = 1; %h{0.333333} = 2; dd %h;
Hash %h = {"0.333333" => 2}

这当然可以固定如下:

>  my %h{Real}; %h{1/3} = 1; %h{0.333333} = 2; dd %h;
Hash[Any,Real] %h = (my Any %{Real} = 0.333333 => 2, <1/3> => 1)

但是现在我需要一个哈希数字哈希,例如{ 1/3 => { 2/3 => 1, 0.666667 => 2 } }

> my %h{Real}; %h{1/3}{2/3} = 1; %h{1/3}{0.666667} = 2; dd %h;
Hash[Any,Real] %h = (my Any %{Real} = <1/3> => ${"0.666667" => 2})

我该如何解决?

我能确定的是以下解决方法:

> my %h{Real}; %h{1/3} //= my %{Real}; %h{1/3}{2/3} = 1; %h{1/3}{0.666667} = 2; dd %h;
Hash[Any,Real] %h = (my Any %{Real} = <1/3> => $(my Any %{Real} = <2/3> => 1, 0.666667 => 2))

但这很烦人。

1 个答案:

答案 0 :(得分:13)

以下作品:

R(ABCDEG)
F= { BE -> CD ; AB -> E B -> D ; A -> C; CE -> A , ABE -> C}
First Step F= { BE -> C ; BE -> D;  AB -> E B -> D ; A -> C; CE -> A , ABE -> C}
Second Step F= { BE -> C ; BE -> D;  AB -> E B -> D ; A -> C; CE -> A , AB -> C} since AB -> E

那不是很好。


以下内容也可以作为解决方法。

my Hash[Real,Real] %h{Real};
%h{1/3} .= new;
%h{1/3}{2/3} = 1;

如果您有多个这样的变量:

my Hash[Real,Real] %h{Real};
%h does role {
  method AT-KEY (|) is raw {
    my \result = callsame;
    result .= new unless defined result;
    result
  }
}

%h{1/3}{2/3} = 1;

say %h{1/3}{2/3}; # 1