2017-02-03 21 views
4

Я применяю закрытие на итераторе, и я хочу использовать стабильный, поэтому я хочу вернуть коробку Iterator. Очевидный способ сделать это состоит в следующем:Почему Box <Итератор <Item = &Foo> + 'a> нужен?

struct Foo; 

fn into_iterator(myvec: &Vec<Foo>) -> Box<Iterator<Item = &Foo>> { 
    Box::new(myvec.iter()) 
} 

Это терпит неудачу, потому что позаимствовать проверки не может вывести соответствующие сроки службы.

После некоторых исследований, я нашел Correct way to return an Iterator?, который привел меня к добавлению + 'a:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<Iterator<Item = &'a Foo> + 'a> { 
    Box::new(myvec.iter()) 
} 

Но я не понимаю,

  • Что это делает
  • И почему необходимо здесь

ответ

8

Есть одна вещь, которая легко упускается из виду: если у вас есть черта Foo, и вы хотите иметь объект с боксами Box<Foo>, компилятор автоматически добавляет 'static срок службы (как указано в RFC 599). Это означает, что Box<Foo> и Box<Foo + 'static> эквивалентны!

В вашем случае, компилятор автоматически добавляет статические связанный таким образом, что это ...

fn into_iterator(myvec: &Vec<Foo>) -> Box<Iterator<Item = &Foo>> 

... эквивалентно:

fn into_iterator(myvec: &Vec<Foo>) -> Box<Iterator<Item = &Foo> + 'static> 

Теперь правила времени жизни Elision удар и «подключить» два слота времени жизни, чтобы приведенный выше код был эквивалентен:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<Iterator<Item = &'a Foo> + 'static> 

Но тип Iter<'a, Foo> (конкретный тип итератора для Vec<Foo>), очевидно, не удовлетворяет оценке 'static (потому что он заимствует Vec<Foo>)! Таким образом, мы должны сказать компилятор, что мы не хотим по умолчанию 'static обязательности указания нашей собственной жизни, связанная:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<Iterator<Item = &Foo> + 'a> 

Теперь компилятор знает, что объект черты действителен только в течение срока службы 'a. Обратите внимание, что нам явно не нужно аннотировать время жизни связанного типа Item! Пожизненные правила элиты позаботятся об этом.

+0

О, конечно! Я совершенно забыл, что речь идет не о Foo, а о самом Итераторе; Сначала я подумал, что привязанность к жизни была построена ... Спасибо, что разъяснил это! – torkleyy