tokuhirom's Blog

Perl6 における イテレータの挙動のメモ

Perl6 のイテレータは、role Iterable を実装しているクラスから取得することができる。 Iterable には iterator メソッドが実装されていて、これを取り出せばよい。

my $iter = $obj.iterator();

この $iter は role Iterator でアレしてます。role Iterator には pull-one というメソッドがあります。pull-one はイテレータが最後に到達すると IterationEnd というシングルトンバリューを返すので、以下のように実装すれば生の iterator を直接さわって順番に舐めることができます。

use v6;
use nqp;

my $obj = [1,2,3];
my $iter = $obj.iterator;
while True {
    my $next = $iter.pull-one();
    if nqp::decont($next) =:= IterationEnd {
        last;
    }
    say $next;
}
say "done";

ただし、このようなローレベルな操作は普通必要ありません。