我正在尝试创建一个实现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
对象?
我不认为[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(我正在测试)没有更新。由于这种变化,我建议使用POSITIONS
和pos
,只需在POSITIONS
中调用POSITIONS
,就可以使用旧版本的任何人。