我AT-POS为类定义了方法并导出了[]运算符.[]但是,当我在该类的实例上使用时,编译器忽略了我定义的运算符.
这是代码:
unit module somelib;
class SomeClass is export {
method AT-POS(@indices) {
say "indices are {@indices.perl}"
}
}
multi postcircumfix:<[ ]> (SomeClass:D $inst, *@indices) is export {
$inst.AT-POS(@indices)
}
Run Code Online (Sandbox Code Playgroud)
#! /usr/bin/env perl6
use v6.c
use lib ".";
use somelib;
my $inst = SomeClass.new;
$inst[3, 'hi'];
# expected output:
# indices are 3, 'hi'
# actual output:
# Type check failed in binding to parameter '@indices';
# expected Positional but got Int (3)
# …Run Code Online (Sandbox Code Playgroud) 我如何实现AT-POS以支持多维范围,例如[0;*]和[*;0]?
在下面的实现中,我收到Index out of range错误:
class Foo {
has @.grid;
multi method elems { @!grid.elems }
multi method AT-POS($y, $x) is rw { @!grid[ $y ; $x ] }
multi method ASSIGN-POS ($y, $x, $new) { @!grid[ $y; $x ] = $new }
multi method EXISTS-POS($y, $x) { @!grid[ $y; $x ]:exists }
}
my $foo = Foo.new: :grid[ ['a'], ['b', 'c'] ];
say $foo[0;0]; # a
say $foo[0;*].elems; # Expect 1, …Run Code Online (Sandbox Code Playgroud) 您可以使用以下命令轻松允许下标访问您自己的类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;
Run Code Online (Sandbox Code Playgroud)
输出:
<a b c d e>
c
<a b c z e>
Run Code Online (Sandbox Code Playgroud)
但我需要二维下标访问.我已经想出如何让这个工作用于阅读,但它在写作时死亡:
class Bar
{
has @.grid;
method AT-POS($y, $x) is rw { return-rw @!grid[$y;$x] }
method Str { '<' …Run Code Online (Sandbox Code Playgroud)