Я пытался выполнить итерацию по подразделу вектора строк, т.е. подклассу Vec<String>
. В течение каждой итерации я хотел передать строку как срез для функции.
Я не заметил, что Vec::get
возвращает Option
, и думал, что могу просто прямо перебрать возвращаемое значение:
fn take_str(s: &str) {
println!("{}", s);
}
fn main() {
let str_vec: Vec<String> =
["one", "two", "three", "uno", "dos", "tres"].iter().map(|&s|
s.into()).collect();
for s in str_vec.get(0..3) {
take_str(&s); // Type mismatch: found type `&&[std::string::String]`
}
}
Очевидно, я ожидал, что s
будет String
, но на самом деле &[String]
. Это связано с тем, что цикл for for фактически выполняет итерацию по Option
, возвращаемую Vec::get()
.
Я также написал следующий код, который показывает, что цикл for
фактически разворачивает Option
:
let foo = Option::Some ( ["foo".to_string()] );
for f in foo {
take_str(&f); // Same error as above, showing `f` is of type `&[String]`
}
Но это невероятно запутанно; Я никогда не ожидал (пока я не написал этот код и не понял, что он на самом деле делает), что Option
можно было бы развернуть, итерации по нему. Почему это поддерживается? Какой вариант использования для итерации по Option
?