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

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

曾航
2023-03-14

您可以使用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个答案

蔡鸿骞
2023-03-14

我的解决方案是(前提是我们只有两个维度):

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 }
}

如果给数组的列表尚未转换,则调整将转换这些列表。AT-POS上的是原始就是所需的:返回rw是一种非常迂回的方法。

陈铭晨
2023-03-14

不知何故,没有调用AT-POS方法。留档提到使用ASSIGN-POS代替,所以我们开始:

class Bar
{
    has @.grid is rw;

    method AT-POS($y, $x) is rw { say "AT-POS $y, $x"; return-rw @!grid[$y;$x] }
    method ASSIGN-POS($y, $x, $new) { say "ASSIGN-POS $y, $x"; @!grid[$y;$x] = $new }
    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;

有趣的是,这产生了另一个错误:

Cannot modify an immutable List ((k l m n o))
  in method ASSIGN-POS at semilist-so.p6 line 8
  in block <unit> at semilist-so.p6 line 16

因此,问题不在于语法,而在于您使用的是不可变列表。您应该使用数组,它是可变的,您将能够做到这一点。

class Bar
{
    has @.grid is rw;

    method AT-POS($y, $x) is rw { return-rw @!grid[$y;$x] }
    method ASSIGN-POS($y, $x, $new) { @!grid[$y;$x] = $new }
    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;
 类似资料:
  • 如何实现以使其支持多维任何范围,例如和? 在下面的实现中,我得到了索引超出范围的错误:

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

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

  • 问题内容: 我在想办法简单地分析字符串输入并在多维数组中找到正确的位置时遇到了麻烦。 我希望有一到两行能够做到这一点,因为我看到的解决方案依赖于较长的(10-20行)循环。 考虑下面的代码(注意,嵌套 可能 ,理论上是任意深度的): 是否可以简单地使用内置函数或其他易于重新创建所需输出的函数? 问题答案: 考虑为您的变量,你想获得或从(演示): 这是乐星串入 密钥 令牌,然后遍历在阵列 带键 的值

  • 问题内容: 我目前正在Visual Studio中编写一些软件,以使用SQL分析来自Access数据库的大量数据。我有编写一个新的计算变量的代码,但在将数据写回到Access所花费的时间上却很挣扎。 我目前正在使用一些vb com代码与以2002/3可比模式运行的Access数据库进行通信。以下是我当前的代码,该代码在循环中运行一个函数以写入数据库。 这是功能: 我目前正在尝试为每个参数插入〜45

  • 问题内容: 如何找到包含自然语言工具包(nltk)使用的所有可能pos标记的列表? 问题答案: 这本书有一个注释,说明如何在标签集上寻求帮助,例如: 其他人可能相似。(注意:也许您首先需要为此从下载助手的“ 模型” 部分进行下载)