Rustで参照を要素に含むIteratorオブジェクトを返す

表題のようなことをやりたくて、次のようなコードを書いてみる。

// Rust-1.14.0
struct Strings(Vec<String>);
impl Strings {
// 文字列を要素とするIteratorのトレイトオブジェクトを返す
fn box_iter<'a>(&'a self) -> Box<Iterator<Item = &'a String>> {
Box::new(self.0.iter())
}
}

要求されたlifetimeを満たすことができない、的な内容でコンパイラに怒られる。

--> src\main.rs:7:25
|
7 | Box::new(self.0.iter())
| ^^^^
|
note: first, the lifetime cannot outlive the lifetime 'a as defined on the block at 6:66...
--> src\main.rs:6:67
|
6 | fn box_iter<'a>(&'a self) -> Box<Iterator<Item = &'a String>> {
| ^
note: ...so that reference does not outlive borrowed content
--> src\main.rs:7:18
|
7 | Box::new(self.0.iter())
| ^^^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that the type `std::slice::Iter<'_, std::string::String>` will meet its required lifetime bounds
--> src\main.rs:7:9
|
7 | Box::new(self.0.iter())
| ^^^^^^^^^^^^^^^^^^^^^^^

返り値のトレイトオブジェクト自体にもBox<Iterator<Item = &'a String> + 'a> といったように明示的にlifetimeを指定( + 'a の部分)してあげれば通るようになる。

最終的なコードは以下の通り。

struct Strings(Vec<String>);
impl Strings {
fn box_iter<'a>(&'a self) -> Box<Iterator<Item = &'a String> + 'a> {
Box::new(self.0.iter())
}
}
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.