Rust 是否有未重新声明的影子变量?

问题描述 投票:0回答:1

我正在尝试学习 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}"),
        }
    }
}

这也行不通。

我错过了什么。我觉得他们都应该工作。

string rust scope match
1个回答
1
投票

“匹配”臂的左侧是一个图案。如果模式中有名称,那么它就是隐式声明。因此,在第一个版本中,第一个臂只是任何值的模式,将其绑定到(新的)局部变量

my_string
。有些语言(例如 erlang)可以取消引用模式中的变量,而 Rust 不能。

第三个版本无法工作,因为函数调用不是有效的模式。

如果您费心阅读编译器错误,第二个版本实际上几乎可以工作:

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
,但模式仅匹配
&str
,因此您需要做的就是通过
item
&str
“转换”为 
String::as_str
来使两者匹配,或者
&**
例如:

fn process_args2(args: Vec<String>) {
    for item in &args[1..]    {
        match &**item {
            "--verbose" => {},
            _=>println!("unexpected argument {item}"),
        }
    }
}

虽然我也会说这不是很有用,但您正在测试标志是否相等,为什么不只是...测试标志是否相等?使用

==
? Rust 不可能从字符串构造跳转表。

© www.soinside.com 2019 - 2024. All rights reserved.