如何在切片上返回迭代器?

时间:2015-04-10 20:48:50

标签: iterator closures rust

fn main() {
    let vec: Vec<_> = (0..5).map(|n| n.to_string()).collect();

    for item in get_iterator(&vec) {
        println!("{}", item);
    }
}

fn get_iterator(s: &[String]) -> Box<Iterator<Item=String>> {
    Box::new(s.iter())
}

1 个答案:

答案 0 :(得分:1)

fn get_iterator<'a>(s: &'a [String]) -> Box<Iterator<Item=&'a String> + 'a> {
    Box::new(s.iter())
}

这里的诀窍是我们从一片项目开始,该片段的生命周期为'aslice::iter返回与切片具有相同生命周期的slice::IterIterator的实现同样返回该生命周期的引用。我们需要将所有生命周期连接在一起。

这解释了参数和'a部分中的Item=&'a。那么+ 'a意味着什么呢?关于此问题,complete answeranother with more detail。简短的版本是在其内部具有引用的对象可以实现特征,因此我们需要在谈论特征时考虑这些生命期。默认情况下,该生命周期为'static,因为确定这是通常的情况。

Box并非严格要求,但是当您不想处理可能构成实施的复杂类型时,您会看到这是正常的事情(或者仅仅是&#39} ; t想要公开实现)。在这种情况下,函数可以

fn get_iterator<'a>(s: &'a [String]) -> std::slice::Iter<'a, String> {
    s.iter()
}

但是如果添加.skip(1),则类型为:

std::iter::Skip<std::slice::Iter<'a, String>>

如果您涉及一个闭包,那么它目前无法指定类型,因为闭包是唯一的,匿名的,自动生成的类型!这些案件需要Box