使用POSITIONS和Code对象时出现问题

问题描述 投票:5回答:1

我正在尝试创建一个实现POSTIONS切片的对象

class Foo is Code { 
    multi method POSITIONS( Foo:D $foo: \pos) { 1,2 }
}; 
say <a b c>[Foo.new]

这个错误“无法使用.new生成Foo对象”。

使其成为独立对象根本不会调用POSITIONS:

class Foo { method POSITIONS { 1 } };
my Foo $foo .= new; 
say <a b c>[$foo] # No such method 'Int' for invocant of type 'Foo'␤ 

这里的主要问题是:调用POSITIONS创建切片的条件是什么?

但是,第二个问题是:为什么不能实例化Code对象?

perl6
1个回答
5
投票

我不认为[Foo.new] This errors with "...使用Code进行物体构造。这是一个非常基础的课程。根据new,实际需要的是source code,这是应用任何课程的简单角色。就个人而言,我本以为它会打电话给Callable

对于你的第二个例子,我们可以找到

CALL-ME

因此,如果事先没有考虑类型,它只会试图强制你的班级没有的multi sub postcircumfix:<[ ]>( \SELF, Any:D \pos ) is raw { SELF.AT-POS(pos.Int); }

你的第一个应该通过简单地改变它来工作

Int

然而这个错误,抱怨class Foo does Callable { method POSITIONS(\foo) { 1 } }; my Foo $foo .= new; say <a b c>[$foo] 没有实施Foo。我可以看到源代码中没有记录该函数,但实现它确实可以使事情神奇地起作用:

.pos

传递给class Foo does Callable { method POSITIONS(|c) { (0,1,2,(0,1),(0,2),(1,2),(0,1,2),(0..2)).pick } method pos(|c) { self.POSITIONS: c } }; my Foo $foo .= new; say <a b c>[$foo] 的位置参数是被切片的列表(在您的示例中为pos),以防您想要根据数组内容调整切片,(a b c) / grep样式。

编辑:

其实,愚蠢的我。 map pos was renamed to和TIO(我正在测试)没有更新。由于这种变化,我建议使用POSITIONSpos,只需在POSITIONS中调用POSITIONS,就可以使用旧版本的任何人。

© www.soinside.com 2019 - 2024. All rights reserved.