代码之家  ›  专栏  ›  技术社区  ›  scottdomini

匹配在Rust中的某个字段中接受向量的枚举

  •  0
  • scottdomini  · 技术社区  · 3 年前

    我正在尝试将事件与标题的开头匹配 pulldown_cmark . 假设我有这个:

    enum MyEvent<'a> {
        Start(MyTag<'a>),
        End(MyTag<'a>),
    }
    
    enum MyTag<'a> {
        Heading(SomeHeadingLevelEnum, Option<&'a str>, Vec<&'a str>,
        Paragraph,
    }
    
    fn main() {
        // Simplified the enums for the sake of the example
        let event = Start(Heading(Level::H1, None, vec![]));
    }
    

    如何将事件与类型匹配?已试用:

    fn main() {
        // ...
        match event {
            Start(Heading(H1, None, [])) => println!("a heading!"),
            _ => println!("yeah not a type I know for sure"),
        }
    }
    

    但得到:

    Start(Heading(H1, None, [])) => println!("a H1!")                                        
                            ^^ pattern cannot match with input type `Vec<&str>`
    

    我尝试了其他方法 vec![] , &[&str] , Vec::new("") ,但也出现了其他错误。

    3 回复  |  直到 3 年前
        1
  •  2
  •   Jeremy Meadows    3 年前

    在中不能有表达式 match 像这样的表达式,它在那里取而代之的是一个变量,如果存在匹配,它将用一个成功的匹配填充该变量。如果你只想在 Vec 为空,则可以使用 match guard 要检查它:

    match event {
        Start(Heading(H1, None, v)) if v.is_empty() => println!("a heading!"),
        _ => println!("yeah not a type I know for sure"),
    }
    

    旁注:代替 &str 在您的 enums 这样,您可能需要使用 String ,这样你就不必到处传播那些讨厌的终生注释。

        2
  •  2
  •   Peter Hall    3 年前

    你无法匹配 Vec 具有特定长度。作为一种模式, [] 匹配长度为零的数组,该数组与 Vec公司 .

    相反,您可以匹配该变量,并为其添加一个为空的保护:

    match event {
        Start(Heading(H1, None, lines)) if lines.is_empty() => println!("a heading!"),
        _ => println!("yeah not a type I know for sure"),
    }
    
        3
  •  1
  •   Netwave    3 年前

    遗憾的是,它不是这样工作的,您必须匹配它,然后在match分支中使用一个守卫:

    match &event {
        MyEvent::Start(MyTag::Heading(Heading::H1, None, v)) if v.is_empty() => println!("a heading!"),
        _ => println!("yeah not a type I know for sure"),
    }
    

    Playground

    推荐文章