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

如何通过AT-POS为不同的类实现2d下标?

臧正平
2023-03-14

这里是一个MRE(显示了两次尝试,其中保留了debug以提供帮助),用于尝试在具有系列列的数据帧中使用AT-POS进行2d订阅。。。

class Series does Positional {
    has Real @.data = [0.1,0.2,0.3];

    method AT-POS( $p ) { 
        @!data[$p]
    }   
}

class DataFrame does Positional {
    has Series @.series;

#`[ ATTEMPT #1
    method AT-POS( $p, $q? ) { 
        given $q {
            when Int {                  #say 'Int';
                @!series[$p][$q]
            }   
            when Whatever {             #say '*';
                @!series[$p].data 
            }   
            default {                   #say 'default';
                @!series[$p] 
            }   

        }   
    }   
#]
    # ATTEMPT #2
    method AT-POS(|c) is raw { #`[dd c;] @!series.AT-POS(|c) }
}

my $df = DataFrame.new( series => [Series.new xx 3] );

say $df[1].data;            #[0.1 0.2 0.3]
say $df[1][2];              #0.3
say $df[0,1];               #(Series.new(data => $[0.1, 0.2, 0.3]) Series.new(data => $[0.1, 0.2, 0.3]))
say $df[1;2];               #0.3
say $df[1;*];               #got (0.1) ... expected [0.1 0.2 0.3]
say $df[*;1];               #got (0.2) ... wanted [0.2 0.2 0.2]

我已经研究了SO,在这里、这里和这里发现了三个相关的问题......我代码中的尝试#2试图将@lizmats答案应用于第三个。令人鼓舞的是,我的MRE中的两个尝试都有相同的行为。但是我不能锻炼

  • 为什么未输入任何{}选项时(尝试#1)
  • |c正在做什么-即使我可以看到它在单下标情况下有效(尝试#2)

我已经用多后缀做了一些实验:

==================

@jonathan在@Lizmat的原始基础上给出了很好的答案-谢谢!这是最终的工作代码:

class Series does Positional {
    has Real @.data = [0.1,0.2,0.3];

    method elems {
        @!data.elems
    }   

    method AT-POS( |p ) is raw {
        @!data.AT-POS( |p )
    }   
}

class DataFrame does Positional {
    has Series @.series;

    method elems { 
        @!series.elems
    }   

    method AT-POS( |p ) is raw { 
        @!series.AT-POS( |p )
    }   
}

my $df = DataFrame.new( series => Series.new xx 3 );

say $df[1].data;            #[0.1 0.2 0.3]
say $df[1][2];              #0.3
say $df[0,1];               #(Series.new(data => $[0.1, 0.2, 0.3]) Series.new(data => $[0.1, 0.2, 0.3]))
say $df[1;2];               #0.3
say $df[1;*];               #(0.1 0.2 0.3)
say $df[*;1];               #(0.2 0.2 0.2)

共有2个答案

单于正业
2023-03-14

这个答案只是对@raiph在评论中提出的观点的阐述:

您可以通过使用句柄简化代码

事实上,您可以做到这一点,以至于我认为有必要在没有注释格式限制的代码块中显示它的外观。

使用句柄,您可以将两个类中的每一个从9个非空白行简化为3个:

class Series does Positional {
    has Real @.data handles <elems AT-POS> = [0.1,0.2,0.3];
}

class DataFrame does Positional {
    has Series @.series handles <elems AT-POS>;
}

(或者你甚至可以将每个类放在一行上,如果你按照我想的方式格式化它们的话。)

该代码对问题代码中的say语句产生所有相同的结果。

朱宏爽
2023-03-14

AT-POS方法只传递整数数组索引。

处理切片的逻辑(使用*、范围、其他可迭代对象、zen切片)位于数组索引运算符中,该运算符被实现为多调度子程序postCirfix:

要使切片工作,必须实现elems以及AT-POS。正在添加:

method elems() { @!data.elems }

系列和:

method elems() { @!series.elems }

DataFrame中提供您正在寻找的结果。

如果确实需要不同的切片语义,或者可能实现比标准的更高效的实现,还可以为索引操作符添加多个候选对象(记住标记它们是导出的)。

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

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

  • 我有一个名为“消费者”的界面。 实现如下所示: } 我需要有2个consumerImpl类的实例,但要注入不同的DBManager实现。如何通过guice配置?

  • 我正在使用selenium webdriver使用test ng Framework自动化测试。这里尝试实现POI和工厂设计模式。基本上,我在两个网站(GUI界面不同)上进行测试,这两个网站都有登录页面、登录名、密码和登录按钮,但最具挑战性的是,两个网站上的网站ID都不一样。如何编写一个通用的方法呢? 对于定位器,我有一个an enum类,在这个类中,我获取每个值的实例并在方法中调用它。

  • 我是使用谓词的新手,不确定我是否正确理解了它。我有一个抽象的类,其中每小时和薪水员工是分开创建的。我的问题依赖于我的类,我不确定如何检查它是否是每小时员工并返回真或假。 我需要为以下所有条件创建不同的谓词: 所有员工,仅每小时一次,仅限工资和全职。 到目前为止,我只是想先让“仅每小时”谓词正常工作,然后再找出剩下的谓词。我不确定在“p”后面加什么来检查它是哪种类型的员工。我目前拥有的是: 我还有一

  • 本文向大家介绍c# 如何实现不同进程之间的通信,包括了c# 如何实现不同进程之间的通信的使用技巧和注意事项,需要的朋友参考一下   进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式:1、剪切板;2、COM;3、内存映射文件;4、WCF 1、剪切板Clipboard在进程间传送对象   剪切板是一个供应用程序使用的公有区域。在.NET中定一个了一个D