代码之家  ›  专栏  ›  技术社区  ›  Paul C

将类型批注添加到`and\u then`时出现“无法对trait对象调用`and\u then`方法”错误`

  •  4
  • Paul C  · 技术社区  · 7 年前

    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

    我想知道这里出了什么问题。

    最终,目标是实现这一目标

    let y = x
        .and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None)
        .and(Some("new String".to_string()));
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Shepmaster Tim Diekmann    7 年前

    这里有多个问题:

    相反 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()));
    
    推荐文章