假设我们有以下类来实现
Iterable
角色:class Word-Char does Iterable {
has @.words;
method !pairize($item) {
return $item => $item.chars;
}
method iterator( Word-Char:D: ) {
@!words.map({self!pairize($_)}).rotor(1).iterator
}
}
在对象构造期间,我可以将对象分配给一个Positional
变量,并在该变量上进行迭代:
my @words = Word-Char.new: words => <the sky is blue>;
.say for @words;
输出:
(the => 3)
(sky => 3)
(is => 2)
(blue => 4)
然而,如果该对象正在传递中,我该如何确保它仍然是可迭代的呢?
my $w = Word-Char.new: words => <the sky is blue>;
sub f( $w ) {
.say for $w
}
f($w);
输出:
Word-Char.new(words => ["the", "sky", "is", "blue"])
目标:
通过使用Iterable
, Iterator
或两者都使用,如果可能的话,我希望能够在任何地方迭代实现这些角色的类的实例对象。目前,我知道通过在对象构造期间将实例对象分配给一个Positional
变量,我可以获得类提供的可迭代项,但这不是我想要的。相反,我想传递对象本身,并在任何时候需要的地方迭代它。