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())
}
答案 0 :(得分:1)
fn get_iterator<'a>(s: &'a [String]) -> Box<Iterator<Item=&'a String> + 'a> {
Box::new(s.iter())
}
这里的诀窍是我们从一片项目开始,该片段的生命周期为'a
。 slice::iter
返回与切片具有相同生命周期的slice::Iter
。 Iterator
的实现同样返回该生命周期的引用。我们需要将所有生命周期连接在一起。
这解释了参数和'a
部分中的Item=&'a
。那么+ 'a
意味着什么呢?关于此问题,complete answer和another 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
。