role PositionalBindFailover { ... }

此角色提供了一个接口,通过该接口,在绑定到 Positional 参数时,可以将对象强制转换为 Positional

例如,Seq 类型不是 Positional,但您仍然可以编写以下内容,因为它 执行 PositionalBindFailover 角色

sub fifths(@a{        # @a is constraint to Positional 
    @a[4];
}
my $seq := gather {     # a Seq, which is not Positional 
    take $_ for 1..*;
}
say fifths($seq);       # OUTPUT: «5␤»

在上面的示例中调用 fifths 通常会产生类型错误,因为 $seq 的类型为 Seq,它不执行 @-sigil 暗示的 Positional 接口。

但是,签名绑定器会识别 Seq 执行 PositionalBindFailover 角色,并调用其 cache 方法将其强制转换为 List,它执行 Positional 角色。

执行该角色的自定义类也是如此;它们只需提供一个生成 Iteratoriterator 方法

class Foo does PositionalBindFailover {
    method iterator {
        class :: does Iterator {
            method pull-one {
                return 42 unless $++;
                IterationEnd
            }
        }.new
    }
}
 
sub first-five (@a{ @a[^5].say }
first-five Foo.new# OUTPUT: # OUTPUT: «(42 Nil Nil Nil Nil)␤»

方法§

方法 cache§

method cache(PositionalBindFailover:D: --> List:D)

基于 iterator 方法返回一个 List,并对其进行缓存。对 cache 的后续调用始终返回相同的 List 对象。

方法 list§

multi method list(::?CLASS:D:)

基于 iterator 方法返回一个 List,而不进行缓存。

方法 iterator§

method iterator(PositionalBindFailover:D:{ ... }

此方法存根确保实现角色 PositionalBindFailover 的类提供一个 iterator 方法。

类型图§

PositionalBindFailover 的类型关系
raku-type-graph PositionalBindFailover PositionalBindFailover Sequence Sequence Sequence->PositionalBindFailover Mu Mu Any Any Any->Mu Cool Cool Cool->Any Iterable Iterable Seq Seq Seq->Sequence Seq->Cool Seq->Iterable RaceSeq RaceSeq RaceSeq->Sequence RaceSeq->Any RaceSeq->Iterable HyperSeq HyperSeq HyperSeq->Sequence HyperSeq->Any HyperSeq->Iterable

展开上面的图表