【问题标题】:How do I declare a hash of hashes of numbers in Perl 6?如何在 Perl 6 中声明数字散列的散列?
【发布时间】:2018-07-01 14:01:04
【问题描述】:

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

> 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 =&gt; { 2/3 =&gt; 1, 0.666667 =&gt; 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))

但这很烦人。

【问题讨论】:

    标签: raku


    【解决方案1】:

    以下作品:

    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;
    

    【讨论】:

    • 谢谢。 my Hash[Real,Real] %h{Real}; 基本上是我一直在寻找的。不得不实例化(手动或使用角色)太糟糕了。有人可能会争辩说,Rakudo 应该使用这种语法自动实例化自己。
    • 我会写成result .= new without result;而不是result .= new unless defined result;
    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 2015-07-17
    • 2016-08-03
    • 2014-01-16
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多