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

时间:2018-12-06 22:08:30

标签: 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);
}

playground

添加强制注释会导致此编译器错误:

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()));

1 个答案:

答案 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()));