我如何实现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, get 2
say $foo[0;*]; # Expect (a), get "Index out of range"
say $foo[*;0]; # Expect (a b), get "Index out of range"
Run Code Online (Sandbox Code Playgroud)
该文档说 API 是AT-POS($index).
当我将您替换AT-POS为:
multi method AT-POS($index) is rw { @!grid[ $index ] }
Run Code Online (Sandbox Code Playgroud)
您的测试用例给出了您期望的结果。
你ASSIGN-POS是不必要的,可能会让事情出错。