提问人:fish 提问时间:8/25/2023 更新时间:8/27/2023 访问量:45
Rust 会隐藏未重新声明的变量吗?[复制]
Does Rust shadow variables that are not re-declared? [duplicate]
问:
我正在尝试学习 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}"),
}
}
}
这也行不通。
我错过了什么。我觉得他们都应该工作。
答:
1赞
Masklinn
8/25/2023
#1
“火柴”手臂的左侧是一个图案。如果模式中有一个名称,则它是一个隐式声明。因此,在第一个版本中,第一个臂只是任何值的模式,将其绑定到(新的)局部变量。有些语言(例如 erlang)可以取消引用模式中的变量,而 Rust 则不能。my_string
第三个版本无法正常工作,因为函数调用不是有效的模式。
如果您费心阅读编译器错误,第二个版本实际上几乎可以工作:
error[E0308]: mismatched types
--> src/lib.rs:4:13
|
3 | match item {
| ---- this expression has type `&String`
4 | "--verbose" => {},
| ^^^^^^^^^^^ expected `&String`, found `&str`
|
= note: expected reference `&String`
found reference `&'static str`
item
是一个 ,但模式只匹配 ,所以你需要做的就是通过 String::as_str 或例如:
&String
&str
item
&str
&**
fn process_args2(args: Vec<String>) {
for item in &args[1..] {
match &**item {
"--verbose" => {},
_=>println!("unexpected argument {item}"),
}
}
}
虽然我也想说这不是很有用,但你正在测试平等的标志,你为什么不只是......测试平等的标志?用?这不像 Rust 可以从字符串中构造跳转表。==
评论
0赞
fish
8/25/2023
谢谢!我这样做主要是为了学习目的,不管它的有效性如何。我没有意识到 str 和 String 是不同的类型O_o,所以谢谢你澄清这一点,这样我就可以继续学习了。
0赞
Masklinn
8/26/2023
哦,天哪,如果你还没有意识到 String 和 str 是不同的东西,那么 Rust 在 stdlib 中就有 6 种字符串类型。
0赞
fish
8/26/2023
哦,哇......这将是有趣的:D
上一个:根据特定条件匹配两个列表
评论