将类型注释添加到 `and_then` 时,“无法在特征对象上调用 `and_then` 方法”错误

mar*_*hon 5 rust

我有一个函数传递给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)

She*_*ter 4

这里有多个问题:

  • 闭包是匿名类型,这意味着您无法命名它们

  • 目前不可能有像这样的裸特征,FnOnce因为它没有大小

  • || foo不是一个特质,而是一个具体类型。

相反,指定闭包的返回类型

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)