2015-08-07 2 views
4

Так я возвращаюсь итератор следующим образом:Каким должен быть тип возвращаемого ИТЭР() клонировали() фильтр() карта()

pub fn get_iter_names(&self) -> ??? { 
self.nodes.iter().cloned() 
    .filter(|x| x.is_some()) 
    .map(|x| x.unwrap().name) 
} 

где self.nodes является Vec<Option<Node>> и Node имеет поданную заявку name. Вопрос заключается в том, каким должен быть тип возврата. Мой компилятор говорит core::iter::Map<core::iter::Filter<core::iter::Cloned<core::slice::Iter<'_, core::option::Option<core::node::ComputeNode>>>, [[email protected]/core/graph.rs:931:12: 931:27]>, [[email protected]/core/graph.rs:932:9: 932:28]>, но проблема в том, что я не знаю, как указать clousure как тип?

Каков правильный способ сделать это в любом случае?

ответ

5

Уверен, что этот вопрос был задан очень много на Stackoverflow, но я не могу его найти, поэтому здесь вы идете.

В Rust unboxed закрытиях есть anonymous типы, сгенерированные компилятором. Следовательно, существует no способ указать их в типе подписей. Это означает, что невозможно вернуть unboxed замыкания по значению.

Обычное решение боксировать возвращаемое значение:

pub fn get_iter_names(&self) -> Box<Iterator<Item=???>> { 
    Box::new(self.nodes.iter().cloned() 
     .filter(|x| x.is_some()) 
     .map(|x| x.unwrap().name)) 
} 

Вы должны указать любой тип name поле имеет вместо ??? (я не могу вывести его из кода в одиночку).

Существует an RFC, чтобы разрешить возврат неразмещенных значений, реализующих некоторые черты, но отложенные. Согласно обсуждению в этом RFC PR, похоже, что в последнее время по крайней мере некоторая работа выполняется, поэтому она может быть доступна в Rust (относительно) в ближайшее время.

Смежные вопросы