当前位置: 首页 > 知识库问答 >
问题:

支持AT-POS多维下标访问中的任何范围

缑嘉玉
2023-03-14

如何实现AT-POS以使其支持多维任何范围,例如[0;*][*; 0]

在下面的实现中,我得到了索引超出范围的错误:

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"

共有1个答案

高茂
2023-03-14

医生说API是AT-POS($index)。

当我将您的AT-POS替换为:

    multi method AT-POS($index) is rw { @!grid[ $index ] }

您的测试用例给出了您期望的结果。

您的ASSIGN-POS是不必要的,可能会让事情出错。

 类似资料:
  • 您可以使用轻松允许下标访问您自己的类: 输出: 但我需要二维下标访问。我已经想出了如何让它在阅读中起作用,但它在写作时就消失了: 输出: 有什么办法可以让这一切顺利吗?

  • 这里是一个MRE(显示了两次尝试,其中保留了debug以提供帮助),用于尝试在具有系列列的数据帧中使用AT-POS进行2d订阅。。。 我已经研究了SO,在这里、这里和这里发现了三个相关的问题......我代码中的尝试#2试图将@lizmats答案应用于第三个。令人鼓舞的是,我的MRE中的两个尝试都有相同的行为。但是我不能锻炼 为什么选项时(尝试#1) 正在做什么-即使我可以看到它在单下标情况下有效

  • 我为一个类定义了方法并导出了运算符。但是,当我在该类的实例上使用时,编译器忽略了我定义的运算符。 这是代码: 那么这段代码有什么问题呢? 更新: 我确实需要将多个索引传递给AT-POS方法,我非常惊讶地发现,在我修复拼写错误时,使用*$索引而不是*@索引可以获得预期的输出。我不知道有这样的用法,比如*$某个参数。它是有效的还是只是编译器的一个bug?

  • 支持多种版本库访问方法 你已经看到了一个版本库可以用多种方式访问,但是可以—或者说安全的—用几种方式同时并行的访问你的版本库吗?回答是可以,倘若你有一些深谋远虑的使用。 在任何给定的时间,这些进程会要求读或者写访问你的版本库: 常规的系统用户使用Subversion客户端(客户端程序本身)通过file://URL直接访问版本库; 常规的系统用户连接使用SSH调用的访问版本库的svnserve进程(

  • 不需要通过配置,以下URL地址是一样的: http://siteurl/index.php?m=User&a=reg 和 http://siteurl/index.php?m=user&a=reg http://siteurl/User/reg 和 http://siteurl/user/reg http://siteurl/Group/Module/action 和 http://siteurl

  • 我在访问二维哈希值时遇到问题。从我在网上可以看出,它应该是这样的: 然而,我得到了一个错误:“类型数组不支持关联索引。” 这是一个最小的可复制示例。 下面是另一个可复制的示例,但时间更长: 在我上面的代码中,访问二维哈希值的问题行将在for循环的第一次迭代中工作一次。然而,它总是在第二次通过时崩溃。我尝试过用静态键值替换大括号中的数组引用,以防这些键值有什么奇怪的地方,但这并不影响结果。我似乎无法