TL; DR JJ'nin cevabı doğru, ama açıklama beni şaşırttı. Şu anda gösterdiğiniz sorunu bir otomatik doğrulama hatası / hata ve / veya LTA hata mesajı olarak görüyorum .
say my Any $Any; # (Any)
say my Hash $Hash; # (Hash)
say my Hash[Int] $Hash-Int; # (Hash[Int])
$Any<a> = 42; # OK
$Hash<a> = 42; # OK
$Hash-Int.new<a> = 42; # OK
$Hash-Int<a> = 42; # must be an object instance, not a type object
Imo bu bir hata ya da birine oldukça yakın.
Aynı senaryoda diziler için de bir hata / sorun geçerlidir:
say my Any $Any; # (Any)
say my Array $Array; # (Array)
say my Array[Int] $Array-Int; # (Array[Int])
$Any[42] = 42; # OK
$Array[42] = 42; # OK
$Array-Int.new[42] = 42; # OK
$Array-Int[42] = 42; # Type check failed ... expected Array[Int] but got Array
En iyi notabug olarak kabul edilirse, belki de hata mesajı değiştirilmelidir. JJ ile hata mesajının gerçekten yerinde olduğunu kabul ederken (raku'nın nasıl çalıştığını anladığınızı ve neler olduğunu anladığınızda), bwim'i raku (do) olarak değiştirmezsek, yine de bir LTA hata mesajı olduğunu düşünüyorum.
Kavrama elinde, hata mesajını en iyi nasıl iyileştirebileceğim açık değil. Ve şimdi bu SO var. (Bu açmayla ilgili benim açımdan cf ... hata mesajı LTA? mi de yazdığım bir son cevap .)
Başka bir çözüm
%
Karma değişken için sigil'i zaten denedim , bu da çalışmıyor.
JJ, açık bir değerle başlayan bir çözüm sundu .new
. Ancak bu, değişkenin kısıtlamasını düşürür. Saklamak için:
class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;
İdeal constant
olarak gerekli olmazdı ve belki de bir gün olmayacak, ancak özellik ayrışmasının sınırlı olduğunu düşünüyorum.