Как мне объявить хэш чисел в Perl 6? - PullRequest
0 голосов
/ 01 июля 2018

Хэш по умолчанию преобразует все ключи в строки. Это вызывает проблемы, когда ваши ключи являются числами, которые могут быть близки:

> 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 голосов
/ 01 июля 2018

работают следующие работы:

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;
...