object - 实现 AT-POS 以返回对象而不是事物列表
问题描述
我有以下课程:
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)
当传递一个参数时,它会按预期工作并如本答案中所述,但范围并非如此,因为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[]
保存系统的值(使用 a )。然后在运行时,当对象不属于正确的类时,使用给定参数调用原始版本。postcircumfix:[ ]>
constant
postcircumfix:<[ ]>
推荐阅读
- python - 我们如何使用 Python seaborn relplot 在所有子图上绘制一条垂直线?
- excel - VBA copy.range 不明白为什么不起作用
- java - 如何使用 onOptionsItemSelected 从 Activity 到 Fragment 制作返回按钮?
- sql - Sql - 有多少人赚取最低和最高工资?
- web-scraping - 从 page.evaluate 中返回一个复杂对象?
- system.security - 设置 Aes KeySize 会生成新密钥吗?
- javascript - Datamaps D3 完成功能链接
- swift - 检测 UIPickerView 何时开始更改/移动
- node.js - 节点-P2P Webrtc-Star
- python - pandas.plot 在 MacBook 上没有显示任何图形