gpt4 book ai didi

object - 实现 AT-POS 以返回对象而不是事物列表

转载 作者:行者123 更新时间:2023-12-04 17:42:44 27 4
gpt4 key购买 nike

我有以下类(class):

class Names {
has @!names;

method add-name( $name ) { @!names.push($name) }

multi method AT-POS( ::?CLASS:D: $index ) {
my $new-names-obj = Names.new;

for @!names[$index] -> $name {
$new-names-obj.add-name($name);
}

return $new-names-obj;
}

method gist {
@!names.join("\n")
}
}

我希望能够切片 Names对象和返回值
应该是另一个 Names其元素从
原版 Names目的。例如:
my $original = Names.new;
$original.add-name($_) for <jonathan joseph jotaro josuke giorno>;
my $sliced-off = $original[0..2];

say $original.^name; #=> Names
say $original; #=> jonathan, joseph, jotaro, josuke, giorno
say $sliced-off.^name; #=> List
say $sliced-off; #=> (jonathan joseph jotaro)

当传递单个参数时,它会按预期工作,如此 answer 中所述。但自 AT-POS 起,范围就不是这样了最终被多次调用并将结果收集在列表中。因此我想知道是否可以返回单个对象 $sliced-off , 不是结果列表,当使用范围时。

最佳答案

AT-POS方法旨在让对象充当 Positional目的。这不是你想要的。你要object[slice] DWIM。

实现这一目标的最佳方法是创建一个 postcircumfic:<[ ]> (多)候选对象:

class A {
method slice(@_) {
say @_; # just to show the principle
}
}
sub postcircumfix:<[ ]>($object, *@indices) {
constant &slicer = &postcircumfix:<[ ]>;
$object ~~ A
?? $object.slice(@indices)
!! slicer($object, @indices)
}

A.new[1,2,4,5]; # [1 2 4 5]

my @a = ^10; # check if foo[] still works
say @a[1,2,4,5]; # (1 2 4 5)

确保 @a[]的共同行为保留,我们保存系统的值 postcircumfix:[ ]>在编译时(带有 constant )。然后在运行时,当对象不是正确的类时,调用 postcircumfix:<[ ]> 的原始版本与给定的参数。

关于object - 实现 AT-POS 以返回对象而不是事物列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60043334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com