2015-06-22 1 views
5

Я хочу, чтобы получить длину строки, которые я расколоть:Тип должен быть известен в этом контексте при использовании итератора :: собирать

fn fn1(my_string: String) -> bool { 
    let mut segments = my_string.split("."); 
    segments.collect().len() == 55 
} 

fn main() {} 
error[E0619]: the type of this value must be known in this context 
--> src/main.rs:3:5 
    | 
3 |  segments.collect().len() == 55 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^ 

Как я могу исправить эту ошибку?

ответ

9

На итератора, the collect method может производить много типов коллекций:

fn collect<B>(self) -> B 
where 
    B: FromIterator<Self::Item>, 

Типы, реализующие FromIterator включают Vec, String и many more. Поскольку существует так много возможностей, что-то должно сдерживать тип результата. Вы можете указать тип с чем-то вроде .collect::<Vec<_>>() или let something: Vec<_> = some_iter.collect().

До тех пор, пока тип не известен, вы не можете вызвать метод len(), потому что невозможно узнать, имеет ли неизвестный тип определенный метод.


Если вы просто хотите, чтобы узнать, сколько элементов есть в итераторе, используйте Iterator.count(); создание вектора для этой цели довольно неэффективно.

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