Atama işleci kullanılırken “'ASSIGN-KEY' yönteminin çağrısı bir nesne örneği olmalıdır”


10

Yazılan tuşlarla karma…

use v6;
class Foo {}
my Hash[Foo, Foo] $MAP;

my $f1 = Foo.new;
my $f2 = Foo.new;

$MAP{$f1} = $f2;

hata üretir:

'ASSIGN-KEY' yönteminin invokanı, 'Hash [Foo, Foo]' türünde bir tür nesnesi değil, 'Hash [Foo, Foo]' türünde bir nesne örneği olmalıdır. '.Yeni' unuttun mu?

Yanıltıcı buluyorum; asıl hata nedir ve onun yerine ne yazmam gerekir?

%Karma değişken için sigil'i zaten denedim , bu da çalışmıyor.


Size teling olan $ MAP bir sınıftır; OTOMH, bunun bir rol olduğunu söyleyebilirim. Onu başlatmanız gerekir. Ama kontrol edeyim.
jjmerelo

Yanıtlar:


7

Onu tanımladığınız şekilde, $MAPaslında bir rol. Onu başlatmanız gerekir (aslında, pun ):

class Foo {}
my Hash[Foo, Foo] $MAP;

my $map = $MAP.new;

my $f1 = Foo.new;
my $f2 = Foo.new;

$map{$f1} = $f2;
say $map;

Buradaki ölü hediye, sınıfların parametrelendirilemeyeceği , rollerin yapılamayacağıydı .

Ayrıca:

say $MAP.DEFINITE; # False
say $map.DEFINITE; # True

Ama aslında hata mesajı, .newburada yaptığım gibi , kullanım önerisine kadar ve oldukça bilgilendiriciydi .

Bunu kısaltabiliriz:

class Foo {}
my %map = Hash[Foo, Foo].new ;
%map{Foo.new} = Foo.new;
%map.say;

Tanımdan punning yaparak $ MAP ara sınıfına ihtiyacımız yok.


6

TL; DR JJ'nin cevabı doğru, ama açıklama beni şaşırttı. Şu anda gösterdiğiniz sorunu bir otomatik doğrulama hatası / hata ve / veya LTA hata mesajı olarak görüyorum .

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 bu bir hata ya da birine oldukça yakın.

Aynı senaryoda diziler için de bir hata / sorun geçerlidir:

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

En iyi notabug olarak kabul edilirse, belki de hata mesajı değiştirilmelidir. JJ ile hata mesajının gerçekten yerinde olduğunu kabul ederken (raku'nın nasıl çalıştığını anladığınızı ve neler olduğunu anladığınızda), bwim'i raku (do) olarak değiştirmezsek, yine de bir LTA hata mesajı olduğunu düşünüyorum.

Kavrama elinde, hata mesajını en iyi nasıl iyileştirebileceğim açık değil. Ve şimdi bu SO var. (Bu açmayla ilgili benim açımdan cf ... hata mesajı LTA? mi de yazdığım bir son cevap .)

Başka bir çözüm

%Karma değişken için sigil'i zaten denedim , bu da çalışmıyor.

JJ, açık bir değerle başlayan bir çözüm sundu .new. Ancak bu, değişkenin kısıtlamasını düşürür. Saklamak için:

class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;

İdeal constantolarak gerekli olmazdı ve belki de bir gün olmayacak, ancak özellik ayrışmasının sınırlı olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.