perl6 – Perl 6:使用AT-POS进行可写的多维下标访问

前端之家收集整理的这篇文章主要介绍了perl6 – Perl 6:使用AT-POS进行可写的多维下标访问前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
您可以使用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是一种非常迂回的方式.

猜你在找的Perl相关文章