我有一个传递给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()));
答案 0 :(得分:4)
这里有多个问题:
关闭是anonymous type,表示您无法命名。
由于it is unsized,目前尚不可能拥有FnOnce
这样的裸露特征。
|| foo
不是特质,而是一种具体的类型。
相反,specify the return type of the closure:
let y = x
.and_then(|_inner| -> Option<String> { None })
.and(Some("new String".to_string()));
或qualify the type of the None
:
let y = x
.and_then(|_inner| None::<String>)
.and(Some("new String".to_string()));
或者避免链接:
let y: Option<String> = x.and_then(|_inner| None);
let y = y.and(Some("new String".to_string()));