Hash dengan kunci yang diketik ...
use v6;
class Foo {}
my Hash[Foo, Foo] $MAP;
my $f1 = Foo.new;
my $f2 = Foo.new;
$MAP{$f1} = $f2;
menghasilkan kesalahan:
Invocant dari metode 'ASSIGN-KEY' harus berupa instance objek dari tipe 'Hash [Foo, Foo]', bukan objek tipe tipe 'Hash [Foo, Foo]'. Apakah Anda lupa 'baru'?
Saya menemukan itu menyesatkan; apa kesalahan sebenarnya dan apa yang harus saya tulis?
Saya sudah mencoba %
sigil untuk variabel hash, itu juga tidak berhasil.
Jawaban:
Dalam cara Anda mendefinisikannya,
$MAP
sebenarnya adalah sebuah peran. Anda perlu instantiate (sebenarnya, pun ) itu:Hadiah mati di sini adalah bahwa kelas tidak dapat dipisah-pisahkan , peran dilakukan.
Juga:
Tapi sebenarnya pesan kesalahannya cukup informatif, hingga dan termasuk saran untuk digunakan
.new
, seperti yang saya lakukan di sini.Kami dapat mempersingkat menjadi:
Dengan melakukan penghukuman dari definisi, kita tidak memerlukan kelas menengah $ MAP.
sumber
TL; DR JJ jawaban benar, tetapi penjelasannya membuat saya bingung. Saat ini saya melihat masalah yang Anda tunjukkan sebagai kesalahan / bug autovivification dan / atau pesan kesalahan LTA.
Imo ini bug atau cukup dekat dengan satu.
Bug / masalah juga berlaku untuk array dalam skenario yang sama:
Jika itu dianggap terbaik notabug, maka mungkin pesan kesalahan harus diubah. Sementara saya setuju dengan JJ bahwa pesan kesalahan sebenarnya tepat (ketika Anda memahami bagaimana raku bekerja dan mencari tahu apa yang terjadi), saya pikir itu tetap merupakan pesan kesalahan LTA jika kita tidak mengubah raku (do) menjadi dwim.
Di sisi lain, tidak jelas bagiku bagaimana cara terbaik untuk memperbaiki pesan kesalahan. Dan sekarang kita punya SO ini. (cf poin saya tentang bahwa Apakah ... pesan kesalahan LTA? di jawaban terakhir saya menulis .)
Solusi lain
JJ telah memberikan solusi yang menginisialisasi dengan nilai dengan eksplisit
.new
. Tapi itu menghilangkan batasan dari variabel. Untuk mempertahankannya:Idealnya
constant
tidak diperlukan, dan mungkin suatu hari tidak, tetapi saya pikir penguraian sifat terbatas.sumber