टीएल; डीआर जेजे का जवाब सही है, लेकिन स्पष्टीकरण ने मुझे भ्रमित कर दिया। मैं वर्तमान में आपके द्वारा दिखाई गई समस्या को स्वतः सुधार त्रुटि / बग और / या 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
Imo यह एक बग या सुंदर एक के करीब है।
एक बग / समस्या एक ही परिदृश्य में सरणियों के लिए भी लागू होती है:
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
यदि यह सबसे अच्छा माना जाता है, तो शायद त्रुटि संदेश को बदल दिया जाना चाहिए। जबकि मैं जेजे के साथ सहमत हूं कि त्रुटि संदेश वास्तव में बिंदु पर है (जब आप समझते हैं कि कैसे रकु काम करता है और पता चल रहा है कि क्या चल रहा है), मुझे लगता है कि यह एक एलटीए त्रुटि संदेश है अगर हम आरकेयू (डू) को बदल नहीं सकते हैं।
मनोरंजक हाथ पर, मेरे लिए यह स्पष्ट नहीं है कि कोई त्रुटि संदेश को कैसे बेहतर बना सकता है। और अब हमारे पास यह एसओ है। (है कि में के बारे में मेरी बात सीएफ ... त्रुटि संदेश एलटीए? है में एक हाल ही में इस सवाल का जवाब मैंने लिखा ।)
एक और समाधान
मैंने पहले से ही %
हैश वेरिएबल के लिए सतर्कता की कोशिश की , जो काम नहीं करता है, या तो।
जेजे ने एक समाधान प्रदान किया है जो एक स्पष्ट मूल्य के साथ आरंभ करता है .new
। लेकिन यह चर से बाधा को गिराता है। इसे बनाए रखने के लिए:
class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;
आदर्श रूप से constant
जरूरत नहीं होगी, और शायद एक दिन यह नहीं होगा, लेकिन मुझे लगता है कि विशेषता पार्सिंग सीमित है।