在这段代码中,我将变量max声明为mut,但ruust-analyer告诉我这不是必需的.我移除了mut,代码仍然工作并运行.为什么会这样呢?我在Match语句中重新赋值为max.

fn validate_in_range_u32(value:u32, min:u32, max:u32) -> bool { 
    if value < min || value > max {
        return false;
    }
    true
}

fn main() { 
    let day = 24;
    let month = 8;

    if !validate_in_range_u32(month, 1, 12) {
        println!("Month is out of range (1-12)");
    }
    let max: u32;
    match month {
        1 | 3 | 5 | 7 | 8 | 10 | 12 => max = 31,
        2 => max = 28,
        4 | 6 | 9 | 11 => max = 30,
        _ => panic!("Should not happen"),
    }

    if !validate_in_range_u32(day, 1, max) {
        println!("Day is out of range (1-{max})");
    }
    
    println!("It worked!");
}

推荐答案

为什么会这样?我在match语句中重新分配max的值.

你并不是真的在分配re,你只是在分配.

与C(++)或Go不同,Rust不执行隐式缺省初始化,它跟踪"位置状态",因此在

let max: u32;

max是定义的,但uninitialised是定义的,如果您try 读取它,则会出现编译错误:

error[E0381]: used binding `max` is possibly-uninitialized

所以match语句只是对其进行初始化,而拉斯特不需要对其进行Mutations .

顺便说一句,与RUST match中的大多数内容一样,RUST match也是表达式,因此更具RUST-Y风格的方法是返回match中的值并就地初始化max:

    let max = match month {
        1 | 3 | 5 | 7 | 8 | 10 | 12 =>31,
        2 => 28,
        4 | 6 | 9 | 11 => 30,
        _ => panic!("Should not happen"),
    };

类型批注也不是必需的,因为validate_in_range_u32强制使用u32.

Rust相关问答推荐

如何从polars DataFrame中获取一个列作为Option String?<>

在rust中如何修改一个盒装函数并将其赋回?

在HashMap中插入Vacant条目的可变借位问题

使用元组执行条件分支的正确方法

我怎样才能从一个Rust 的日期中go 掉3年?

返回的future 不是`发送`

在Rust中宏的表达式中提取对象

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

`*mut[T]`与`*mut T`的区别

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

使用 pyo3 将 Rust 转换为 Python 自定义类型

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

如何使用 rust bindgen 生成的 std_vector

Rust,我如何正确释放堆分配的内存?

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

Iterator::collect如何进行转换?

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?

为什么当borrow 变量发生变化时,borrow 变量不会改变?