Rust 会隐藏未重新声明的变量吗?[复制]

Does Rust shadow variables that are not re-declared? [duplicate]

提问人:fish 提问时间:8/25/2023 更新时间:8/27/2023 访问量:45

问:

我正在尝试学习 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&stritem&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