代码之家  ›  专栏  ›  技术社区  ›  mscha

如何在Perl6中声明数字散列?

  •  8
  • mscha  · 技术社区  · 6 年前

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

    > 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 回复  |  直到 6 年前
        1
  •  13
  •   Brad Gilbert    6 年前

    以下工作:

    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
    

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

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