Hash mit getippten Schlüsseln…
use v6;
class Foo {}
my Hash[Foo, Foo] $MAP;
my $f1 = Foo.new;
my $f2 = Foo.new;
$MAP{$f1} = $f2;
erzeugt den Fehler:
Der Aufruf der Methode 'ASSIGN-KEY' muss eine Objektinstanz vom Typ 'Hash [Foo, Foo]' sein, kein Typobjekt vom Typ 'Hash [Foo, Foo]'. Hast du ein '.neues' vergessen?
Ich finde es irreführend; Was ist der wahre Fehler und was muss ich stattdessen schreiben?
Ich habe bereits das %
Siegel für die Hash-Variable ausprobiert , das funktioniert auch nicht.
Antworten:
In der Art, wie Sie es definiert haben,
$MAP
ist eigentlich eine Rolle. Sie müssen es instanziieren (eigentlich Wortspiel ):Das tote Werbegeschenk hier war, dass Klassen nicht parametrisiert werden können , Rollen schon.
Ebenfalls:
Aber eigentlich war die Fehlermeldung ziemlich informativ, bis hin zum Vorschlag
.new
, wie ich es hier tue.Wir können es verkürzen auf:
Wenn wir die Definition ausführen, benötigen wir die $ MAP-Zwischenklasse nicht.
quelle
Die Antwort von TL; DR JJ ist richtig, aber die Erklärung hat mich verwirrt. Ich betrachte das von Ihnen angezeigte Problem derzeit als Autovivifizierungsfehler / Fehler und / oder LTA-Fehlermeldung.
Imo das ist ein Fehler oder ziemlich nah an einem.
Ein Fehler / Problem tritt auch für Arrays im selben Szenario auf:
Wenn es am besten als notabug angesehen wird, sollte möglicherweise die Fehlermeldung geändert werden. Obwohl ich JJ zustimme, dass die Fehlermeldung tatsächlich zutreffend ist (wenn Sie verstehen, wie Raku funktioniert und herausfinden, was los ist), denke ich, dass es dennoch eine LTA-Fehlermeldung ist, wenn wir Raku (do) nicht in dwim ändern.
Auf der packenden Hand ist mir nicht klar, wie man die Fehlermeldung am besten verbessern kann. Und jetzt haben wir dieses SO. (Siehe meinen Punkt dazu in Ist die ... Fehlermeldung LTA? in einer kürzlich von mir geschriebenen Antwort .)
Eine andere Lösung
JJ hat eine Lösung bereitgestellt, die mit einem Wert mit einem expliziten Wert initialisiert wird
.new
. Dadurch wird jedoch die Einschränkung aus der Variablen entfernt. Um es zu behalten:Im Idealfall
constant
würde das nicht benötigt und vielleicht eines Tages auch nicht, aber ich denke, das Parsen von Merkmalen ist begrenzt.quelle