"Invocant of method 'ASSIGN-KEY' must be an object instance" when using assignment operator

daxim :

Hash with typed keys…

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

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

$MAP{$f1} = $f2;

produces the error:

Invocant of method 'ASSIGN-KEY' must be an object instance of type 'Hash[Foo,Foo]', not a type object of type 'Hash[Foo,Foo]'. Did you forget a '.new'?

I find it misleading; what's the real error and what do I have to write instead?

I already tried the % sigil for the hash variable, that doesn't work, either.

jjmerelo :

In the way you have defined it, $MAP is actually a role. You need to instantiate (actually, pun) it:

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

my $map = $MAP.new;

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

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

Dead giveaway here was that classes can't be parametrized, roles do.

Also:

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

But actually the error message was pretty informative, up to and including the suggestion to use .new, as I do here.

We can shorten it down to:

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

By doing the punning from the definition, we don't need the $MAP intermediate class.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=29484&siteId=1