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
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
หากเป็นการดีที่สุดที่ควรพิจารณาก็คืออาจมีการเปลี่ยนแปลงข้อความแสดงข้อผิดพลาด ในขณะที่ฉันเห็นด้วยกับ JJ ว่าข้อความแสดงข้อผิดพลาดนั้นเกิดขึ้นจริง (เมื่อคุณเข้าใจว่า raku ทำงานอย่างไรและเข้าใจว่าเกิดอะไรขึ้น) ฉันคิดว่ามันเป็นข้อความแสดงข้อผิดพลาด LTA หากเราไม่เปลี่ยน raku (ทำ) เป็น dwim
ในมือของฉันไม่เห็นชัดเจนว่าจะปรับปรุงข้อความแสดงข้อผิดพลาดได้ดีที่สุดอย่างไร และตอนนี้เรามีสิ่งนี้ (CF จุดของฉันเกี่ยวกับในการที่เป็นข้อผิดพลาด ... ข้อความ LTA?ในคำตอบที่ผ่านมาผมเขียน .)
ทางออกอื่น
ฉันลองใช้%
sigil สำหรับตัวแปร hash แล้วซึ่งไม่ได้ผลเช่นกัน
JJ ได้จัดให้มีการแก้ปัญหาที่ initializes .new
ที่มีค่าที่มีอย่างชัดเจน แต่นั่นทำให้ข้อ จำกัด ลดลงจากตัวแปร เพื่อรักษามัน:
class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;
เป็นการดีที่constant
จะไม่ต้องการและบางทีวันหนึ่งก็ไม่ได้ แต่ฉันคิดว่าการแยกลักษณะมี จำกัด