Почему-то метод AT-POS
не вызывается. документация упоминает об использовании ASSIGN-POS
вместо этого, поэтому здесь мы идем:
class Bar
{
has @.grid is rw;
method AT-POS($y, $x) is rw { say "AT-POS $y, $x"; return-rw @!grid[$y;$x] }
method ASSIGN-POS($y, $x, $new) { say "ASSIGN-POS $y, $x"; @!grid[$y;$x] = $new }
method Str { '<' ~ @!grid».join(' ').join("\n ") ~ '>' }
method gist { self.Str }
}
my $bar = Bar.new(:grid(<a b c d e>, <f g h i j>, <k l m n o>));
say $bar;
say $bar[1;2];
$bar[2;3] = 'z';
say $bar;
Что, что интересно, приводит к еще одной ошибке:
Cannot modify an immutable List ((k l m n o))
in method ASSIGN-POS at semilist-so.p6 line 8
in block <unit> at semilist-so.p6 line 16
Итак, проблема не в синтаксисе, а в том, что вы работаете с неизменяемыми списками.Вы должны использовать Array
s, которые являются изменяемыми, и вы сможете это сделать.
class Bar
{
has @.grid is rw;
method AT-POS($y, $x) is rw { return-rw @!grid[$y;$x] }
method ASSIGN-POS($y, $x, $new) { @!grid[$y;$x] = $new }
method Str { '<' ~ @!grid».join(' ').join("\n ") ~ '>' }
method gist { self.Str }
}
my $bar = Bar.new(:grid([<a b c d e>], [<f g h i j>], [<k l m n o>]));
say $bar;
say $bar[1;2];
$bar[2;3] = 'z';
say $bar;