TL; DR JJの答えは正しいですが、説明では混乱しました。私は現在、あなたが示した問題をautovivificationエラー/バグまたはLTAエラーメッセージとして表示しています。
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
イモこれはバグかかなり近いです。
同じシナリオで、バグ/問題が配列にも適用されます。
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
notabugを検討するのが最善の場合は、おそらくエラーメッセージを変更する必要があります。エラーメッセージが実際に適切であるとJJに同意していますが(rakuの仕組みを理解し、何が起こっているのかを理解している場合)、それでもraku(do)をdwimに変更しない場合は、LTAエラーメッセージであると思います。
握る側では、エラーメッセージをどのように改善すればよいかは明らかではありません。そして今、このSOがあります。(その中程度の私のポイントCF ?...エラーメッセージLTAですで私が書いた最近の答え。)
別の解決策
私はすでに%
ハッシュ変数のシギルを試しましたが、それもうまくいきません。
JJは、明示的なを持つ値で初期化するソリューションを提供しています.new
。しかし、それによって変数から制約が削除されます。それを保持するには:
class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;
理想的にconstant
はそれは必要ないでしょう、そしておそらくいつかそれは必要ないでしょうが、私は特性解析が制限されていると思います。