我有一个函数传递给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);
}
Run Code Online (Sandbox Code Playgroud)
添加强制注释会导致此编译器错误:
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);
}
Run Code Online (Sandbox Code Playgroud)
我认为它是在抱怨这种FnOnce特性,但我不明白这与x.
我想了解这里出了什么问题。
最终,目标是and_then在链式语句中实现这一点,这就是需要注释的原因。
let y = x
.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None)
.and(Some("new String".to_string()));
Run Code Online (Sandbox Code Playgroud)
这里有多个问题:
相反,指定闭包的返回类型:
let y = x
.and_then(|_inner| -> Option<String> { None })
.and(Some("new String".to_string()));
Run Code Online (Sandbox Code Playgroud)
或者限定 的类型None:
let y = x
.and_then(|_inner| None::<String>)
.and(Some("new String".to_string()));
Run Code Online (Sandbox Code Playgroud)
或者避免链接:
let y: Option<String> = x.and_then(|_inner| None);
let y = y.and(Some("new String".to_string()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |