String 什么是正确的&;检查字符串是否以Rust中的某个字符开头的惯用方法?

String 什么是正确的&;检查字符串是否以Rust中的某个字符开头的惯用方法?,string,rust,String,Rust,我想检查字符串是否以一些字符开头: for line in lines_of_text.split("\n").collect::<Vec<_>>().iter() { let rendered = match line.char_at(0) { '#' => { // Heading Cyan.paint(*line).to_string() } '>'

我想检查字符串是否以一些字符开头:

for line in lines_of_text.split("\n").collect::<Vec<_>>().iter() {
    let rendered = match line.char_at(0) {
        '#' => {
            // Heading
            Cyan.paint(*line).to_string()
        }
        '>' => {
            // Quotation
            White.paint(*line).to_string()
        }
        '-' => {
            // Inline list
            Green.paint(*line).to_string()
        }
        '`' => {
            // Code
            White.paint(*line).to_string()
        }
        _ => (*line).to_string(),
    };
    println!("{:?}", rendered);
}

我目前使用的是Rust 1.5,错误消息给出了一些有用的提示:

此方法经常被
chars()
迭代器替换,以后可能会删除或重命名此方法;它通常由
chars
/
char\u索引
迭代器替换,或者从子片中获取第一个char(请参阅)

  • 我们可以按照错误文本进行操作:

    用于文本的行中的行。拆分(“\n”){
    匹配行.chars().next(){
    一些(“#”)=>println!(“标题”),
    一些('>')=>println!(“报价”),
    一些('-')=>println!(“内联列表”),
    一些('`')=>println!(“代码”),
    一些()=>println!(“其他”),
    None=>println!(“空字符串”),
    };
    }
    
    请注意,这会暴露您未处理的错误情况!如果没有第一个角色呢

  • 我们可以对字符串进行切片,然后在字符串切片上进行模式匹配:

    用于文本的行中的行。拆分(“\n”){
    匹配和行[…1]{
    “#”=>println!(“标题”),
    “>”=>println!(“报价”),
    “-”=>println!(“内联列表”),
    “`=>println!(“代码”),
    _=>println!(“其他”)
    };
    }
    
    对字符串的切片操作是按字节进行,因此,如果第一个字符不完全是1字节(也称为ASCII字符),则会死机。如果字符串为空,它也会死机。您可以选择避免这些恐慌:

    用于文本的行中的行。拆分(“\n”){
    匹配线。获取(…1){
    有些(“#”)=>println!(“标题”),
    一些(“>”=>println!(“报价”),
    一些(“-”=>println!(“内联列表”),
    一些(“`”)=>println!(“代码”),
    _=>println!(“其他”),
    };
    }
    
  • 我们可以使用与您的问题陈述直接匹配的方法:

    用于文本的行中的行。拆分(“\n”){
    if line.u以('#'){println!(“标题”)开头
    else if line.u以('>'){println!(“引号”)开头
    else if line.u以('-'){println!(“内联列表”)开头
    else if line.u以('`'){println!(“代码”)开头
    否则{println!(“其他”)}
    }
    
    请注意,如果字符串为空或第一个字符不是ASCII,则此解决方案不会死机。出于这些原因,我可能会选择这个解决方案。将if主体与
    if
    语句放在同一行不是正常的Rust样式,但我这样做是为了使其与其他示例保持一致。您应该看看如何将它们分离到不同的线条上



  • 顺便说一句,您不需要收集::().iter(),这只是效率低下。没有理由使用迭代器,从中构建一个向量,然后在向量上迭代。只需使用原始迭代器。

    是的,我认为收集向量也是低效的。我不知道Split和iter是同一个迭代器。请问,您的解决方案哪一个更快?还是他们的速度差不多?@rilut你可以问,但我不知道答案。也许有人会插话进来,但你也可以在你的应用程序中做一些性能测试,然后确定。我可能会猜它们都是一样的。每个人都很困惑,但至少现在答案是完美的:)@rilut它在任何方面都不是同一个迭代器,但它仍然是一个迭代器。@bluss是的,这就是我的意思:)