我正在尝试学习 Rust,并尝试编写一个简单的程序,该程序从命令行获取参数,以习惯一些基本概念。我编写的用于处理参数的代码失败了,我觉得我缺少一些基本概念。
fn process_args(args: Vec<String>) {
let my_string: String = String::from("--verbose");
for item in &args[1..] {
match item{
my_string=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
vscode 告诉我“my_string”变量未使用。我也尝试过这个版本:
fn process_args(args: Vec<String>) {
for item in &args[1..] {
match item{
"--verbose"=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
由于字符串文字无法与字符串匹配而失败,然后我尝试了:
fn process_args(args: Vec<String>) {
for item in &args[1..] {
match item{
String::from("--verbose")=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
这也行不通。
我缺少什么。我觉得他们都应该工作。
“匹配”臂的左侧是一个图案。如果模式中有名称,那么它就是隐式声明。因此,在第一个版本中,第一个臂只是任何值的模式,将其绑定到(新的)局部变量
my_string
。有些语言(例如 erlang)可以取消引用模式中的变量,而 Rust 不能。第三个版本无法工作,因为函数调用不是有效的模式。
如果您费心阅读编译器错误,第二个版本实际上几乎可以工作:
item
是 an&String
,但模式仅匹配&str
,因此您需要做的就是通过“转换”item
为&str
、 viaString::as_str
或&**
例如使两者匹配:虽然我也会说这不是很有用,但您正在测试标志是否相等,为什么不只是...测试标志是否相等?使用
==
?Rust 不可能从字符串构造跳转表。