У меня есть функция, переданная в and_then
, которая возвращает тип, неизвестный компилятору.При связывании с другими опциональными методами требуются аннотации типов.
fn main() {
let w = Some("hi".to_string());
let x: Option<&String> = w.as_ref();
//fails:
let y: Option<String> =
x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);
//ok:
let y: Option<String> = x.and_then(|_inner: &String| None);
}
детская площадка
Добавление обязательных аннотаций приводит к этой ошибке компилятора:
error: the `and_then` method cannot be invoked on a trait object
--> src/main.rs:7:11
|
7 | x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);
| ^^^^^^^^
Я полагаю, что это жалоба на черту FnOnce
, но я не понимаю, какое это имеет отношение к x
.
Я бы хотел понять, что здесь происходит не так.
В конечном счете, цель состоит в том, чтобы иметь это and_then
в цепочечном утверждении, поэтому аннотации необходимы.
let y = x
.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None)
.and(Some("new String".to_string()));