টিএল; ডিআর জেজে-র উত্তরটি সঠিক, তবে ব্যাখ্যাটি আমাকে বিভ্রান্ত করেছিল। আপনি বর্তমানে অটোভিভিফিকেশন ত্রুটি / বাগ এবং / অথবা এলটিএর ত্রুটি বার্তা হিসাবে যে সমস্যাটি দেখিয়েছেন তা আমি বর্তমানে দেখছি ।
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
যদি এটি নোটব্যাগ হিসাবে বিবেচনা করা হয় তবে সম্ভবত ত্রুটির বার্তাটি পরিবর্তন করা উচিত। আমি জেজে-র সাথে একমত হয়েছি যে ত্রুটি বার্তাটি আসলে পয়েন্টে রয়েছে (যখন আপনি বুঝতে পারেন যে রাকু কীভাবে কাজ করে এবং কী ঘটছে তা নির্ধারণ করে) তবে আমি মনে করি এটি তবুও যদি আমরা রাকুকে পরিবর্তন না করে তবে এটি একটি এলটিএর ত্রুটি বার্তা।
আঁকড়ে ধরার পক্ষে, এটি ত্রুটি বার্তাকে কীভাবে উন্নত করতে পারে তা আমার কাছে স্পষ্ট নয়। এবং এখন আমরা এই এসও আছে। (যে সম্পর্কে আমার বিন্দু CF ... ত্রুটির বার্তা LTA? Is মধ্যে একটি সাম্প্রতিক উত্তর আমি লিখেছি ।)
আর একটি সমাধান
আমি ইতিমধ্যে %হ্যাশ ভেরিয়েবলের জন্য সিগিল চেষ্টা করেছি, এটিও কাজ করে না।
জেজে এমন একটি সমাধান সরবরাহ করেছে যা একটি স্পষ্ট করে মান সহ আরম্ভ করে .new। কিন্তু এটি পরিবর্তনশীল থেকে সীমাবদ্ধতা হ্রাস করে। এটি ধরে রাখতে:
class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;
আদর্শভাবে constantএটির প্রয়োজন হবে না, এবং সম্ভবত একদিন এটি হবে না তবে আমি মনে করি বৈশিষ্ট পার্সিং সীমাবদ্ধ।