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

如何定义“AT-POS”方法?

宰父俊民
2023-03-14

我为一个类定义了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)
}
#! /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)
#     in method AT-POS at xxx/somelib.pm6 (somelib) line 4
#     in block <unit> at ./client.pl6 line 8

那么这段代码有什么问题呢?

更新:

我确实需要将多个索引传递给AT-POS方法,我非常惊讶地发现,在我修复拼写错误时,使用*$索引而不是*@索引可以获得预期的输出。我不知道有这样的用法,比如*$某个参数。它是有效的还是只是编译器的一个bug?

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)
}
#! /usr/bin/env perl6

use v6.c;
use lib ".";
use somelib;

my $inst = SomeClass.new;

$inst[3, 'hi'];

# expected output:
#   indices are 3, 'hi' # or something like it 

# actual output:
#   indices are $(3, "hi") # It's ok for me.

共有1个答案

洪俊能
2023-03-14

问题是,AT-POS只能接收一维位置的单个参数。如果指定一个切片,则该设置将负责多次调用AT-POS,并将结果收集到列表中:

class A {
    method AT-POS($a) { 2 * $a }
}
dd A.new[1,2,3,4];  # (2,4,6,8)

此外,您不需要提供后循环修复:

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

  • 如何实现以使其支持多维任何范围,例如和? 在下面的实现中,我得到了索引超出范围的错误:

  • 本文向大家介绍Linux用户自定义at、cron计划任务执行的方法,包括了Linux用户自定义at、cron计划任务执行的方法的使用技巧和注意事项,需要的朋友参考一下 Linux系统中有两种计划任务,一种是只会执行一次 at 计划任务,一种是可以周期性地执行的 cron 计划任务 at 一次性计划任务 描述 在指定的时间执行特定命令(单次),也称为延时动作任务。 用法 参数 实例 首先查看系统时间

  • 我在运行项目时遇到错误: 环境: 请求方法:发布请求URL:http://127.0.0.1:8000/ Django版本:1.8。4 Python版本:2.7。6个已安装的应用程序:('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','djang

  • 问题内容: 我的问题与此相似。它涉及对象方法而不是模块内容。我想知道是否可以使用inspect模块来获取仅在我要询问的类中定义的方法,而不是其父类中定义的方法。 我之所以需要这样做,是因为我的子类定义了“宏”方法,该方法在更高的抽象级别访问父方法,并且我不希望用户担心在继承过程中一直定义的较低级别的方法。树。 这是一个简化的示例: 输出: 用户不必知道或关心fs的存在,因为她只会对gs感兴趣。(当

  • 问题内容: 在Python中,该类充当所有(新样式)类的根超类。至少默认情况下,将和应用于的任何子类的“类实例”会产生相同的结果: 我想定义一个的子类,例如,它在每种方式上都是相同的,除了对自身和产生不同的输出: 有没有办法在Python中做到这一点? PS:我知道特殊的方法,但是据我了解,如果类重写,则仅当在的实例上调用时才调用覆盖方法,而不是在自身上调用时。即: 问题答案: 实际上,与对象实例