raku - 如何在 Perl 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))
但这很烦人。
解决方案
以下作品:
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;
推荐阅读
- sql - SQL Case 语句在 THEN 子句上增加值
- ruby-on-rails - 在 EC2 上运行 setup-ruby (GitHub Actions) 会抛出 ENOENT: no such file or directory, mkdir
- python - 熊猫从长到宽格式 - 基于 X 列中的较小值和较大值进行拆分
- c# - 哪个命名管道客户端首先连接
- python - 动态更新颜色条标题 - Plotly
- looker - 谁能帮我在 STATUS 字段上创建 Looker Alerts
- flutter - 主体可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型
- windows - 无法加载流浪机器“mount -t vboxsf -o uid=1000,gid=1000,_netdev vagrant /vagrant”
- php - 如何从 php 中删除 div 类?
- javascript - 如何降低多个 if 语句的复杂性