Хеш с набранными ключами ...
use v6;
class Foo {}
my Hash[Foo, Foo] $MAP;
my $f1 = Foo.new;
my $f2 = Foo.new;
$MAP{$f1} = $f2;
выдает ошибку:
Инвокант метода 'ASSIGN-KEY' должен быть экземпляром объекта типа 'Hash [Foo, Foo]', а не объектом типа типа 'Hash [Foo, Foo]'. Вы забыли «.new»?
Я нахожу это вводящим в заблуждение; что является настоящей ошибкой и что я должен написать вместо этого?
Я уже пробовал %
сигил для хеш-переменной, которая тоже не работает.
Ответы:
То, как вы это определили,
$MAP
на самом деле является ролью. Вам нужно создать (на самом деле, каламбур ) это:Мертвая распродажа здесь заключалась в том, что классы не могут быть параметризованы , роли - нет.
Также:
Но на самом деле сообщение об ошибке было довольно информативным, вплоть до предложения использовать
.new
, как я делаю здесь.Мы можем сократить его до:
Выполняя определение из определения, нам не нужен промежуточный класс $ MAP.
источник
TL; DR JJ ответ правильный, но объяснение оставило меня в замешательстве. В настоящее время я вижу проблему, которую вы показывали, как сообщение об ошибке автовификации / баг и / или LTA.
По-моему, это ошибка или довольно близко к ней.
Ошибка / проблема применима и к массивам в том же сценарии:
Если это лучше всего считать notabug, то, возможно, сообщение об ошибке следует изменить. Хотя я согласен с JJ в том, что сообщение об ошибке действительно присутствует (когда вы понимаете, как работает raku и выясняете, что происходит), я думаю, что это, тем не менее, сообщение об ошибке LTA, если мы не изменим raku (do) на dwim.
С другой стороны, для меня не очевидно, как лучше всего улучшить сообщение об ошибке. И теперь у нас есть это ТАК. (Сравните мою точку зрения на это в ... сообщении об ошибке LTA? в недавнем ответе, который я написал .)
Другое решение
JJ предоставил решение, которое инициализируется значением с явным
.new
. Но это снимает ограничение с переменной. Чтобы сохранить это:В идеале в
constant
этом нет необходимости, и, возможно, однажды это не понадобится, но я думаю, что разбор черт ограничен.источник