我使用Rust开发将近一年了,每次我读到Rust的核心概念中包含了“模式匹配”时,心里就会不由冷笑,因为我对模式匹配的理解仅限于对枚举值,Result和Option的简单处理,没有觉得它有好高级的地方。但是,最近AI给我提供的一个Rust的例子代码,着实把我惊艳到了。
我的问题:
我需要一个Rust函数,可以从下面的文本中,抓去标签<!--cli:custom-header--><!--/cli-->
之间的文本
AI的回答:
fn extract_custom_header(text: &str) -> Option<&str> {
let start_tag = "<!--cli:custom-header-->";
let end_tag = "<!--/cli-->";
let start_index = text.find(start_tag);
let end_index = text.find(end_tag);
match (start_index, end_index) {
(Some(start), Some(end)) => {
let content = &text[start + start_tag.len()..end];
Some(content.trim())
}
_ => None
}
}
fn main() {
let text = r#"
<html>
<head>
<!--cli:custom-header-->
<title>Custom Header</title>
<!--/cli-->
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
"#;
if let Some(content) = extract_custom_header(text) {
println!("Extracted content: {}", content);
} else {
println!("Couldn't find custom header");
}
}
其中,start_index和end_index直接通过模式匹配来取值,这是一个让我觉得值得学习的方面。
match (start_index, end_index) {
(Some(start), Some(end)) => {
let content = &text[start + start_tag.len()..end];
Some(content.trim())
}
_ => None
}
个人觉得,这种模式匹配的使用方式之所以值得学习,是因为它能帮助我们在面对多种返回结果时,可以更加简洁和高效的去组织代码逻辑。
这种方式具有以下2个特点:
简洁性和可读性:模式匹配可以将多个条件判断整合到一处,使代码更加简洁和可读。在这段代码中,通过使用模式匹配,可以将多个可能的情况整合到一个match表达式中,使得代码更加清晰明了。
完备性检查:模式匹配可以进行完备性检查,即确保所有可能的情况都被处理到。在这段代码中,通过匹配(Some(start), Some(end)),可以确保只有当start_index和end_index都存在时才执行相应的逻辑;同时,通过"_"这个模式匹配的默认值,显示的给出处理方式,可以确保代码处理了所有可能的情况。
上面的代码来至于我的开源项目:https://gitee.com/hanshu_alan
这篇文章收录我的Rust-实战专栏。请关注我,不要错过更新哟。