您可以使用AT-POS轻松允许下标访问您自己的类:
class Foo { has @.grid; method AT-POS($x) is rw { return-rw @!grid[$x] } method Str { '<' ~ @!grid.join(' ') ~ '>' } method gist { self.Str } } my $foo = Foo.new(:grid(<a b c d e>)); say $foo; say $foo[2]; $foo[3] = 'z'; say $foo;
输出:
<a b c d e> c <a b c z e>
但我需要二维下标访问.我已经想出如何使这个工作用于阅读,但它在写作时死亡:
class Bar { has @.grid; method AT-POS($y,$x) is rw { return-rw @!grid[$y;$x] } 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;
输出:
<a b c d e f g h i j k l m n o> h Too few positionals passed; expected 3 arguments but got 2 in method AT-POS at ./p6subscript line 25 in block <unit> at ./p6subscript line 33
有没有办法让这项工作?
解决方法
我的解决方案是(假设我们只有2个维度):
class Bar { has @.grid; method TWEAK() { $_ .= Array for @!grid } method AT-POS(|c) is raw { @!grid.AT-POS(|c) } method Str { '<' ~ @!grid».join(' ').join("\n ") ~ '>' } method gist { self.Str } }
TWEAK将转换给阵列的任何列表,如果它们还没有.只需要AT-POS上的原始数据:return-rw是一种非常迂回的方式.