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是的,这就是我的意思:)