gpt4 book ai didi

rust - 是否可以在不使用 unsafe 或 panicing 的情况下将潜在未初始化的变量标记为良好?

转载 作者:行者123 更新时间:2023-11-29 08:10:11 27 4
gpt4 key购买 nike

是否可以向编译器解释 v 变量在标记为 1 的行中很好,而无需使用不安全或可能调用 panic 的代码!

#[derive(PartialEq, Debug)]
enum Enum {
V1,
V2,
V3,
}

fn main() {
let e = Enum::V1;

let mut v: i32;

if e == Enum::V1 || e == Enum::V2 {
v = 17; //some complex, costy expression
}
match e {
Enum::V1 | Enum::V2 => {
println!("Results: {}", v); //1
}
_ => {}
}
}

编译器报告:

error[E0381]: use of possibly uninitialized variable: `v`
--> src/main.rs:18:37
|
18 | println!("Results: {}", v); //1
| ^ use of possibly uninitialized `v`

我有一个复杂的表达式来在我的真实代码中初始化 v 而不是 17v 的类型没有实现 默认,对于Enum::V1Enum::V2 情况,我只需要v

在实际代码中,我为 Enum::V1Enum::V2 设置了单独的分支,我可以将 v 初始化移动到那里.

我想让我的代码更清晰,我不想使用潜在的坏东西,比如 unsafeOption::unwrap

最佳答案

简单的方法就是初始化v;它是一个单词,如果不需要,编译器可能会优化掉它。在这种特殊情况下,您甚至可以将声明和初始化都移到匹配的内部范围内,因为它不会在其他任何地方使用。

更简洁的做法是使无效案例无法表示。这里 v 仅在 V1V2 情况下真正存在,因此如果我们加入这两者,我们就没有可能未初始化的名称值(value)。

#[derive(PartialEq, Debug)]
enum Enum {
V1 { v: i32 },
V2 { v: i32 },
V3
}

fn main() {
let mut e = Enum::V1 { v: 17 };

match e {
Enum::V1 {v} | Enum::V2 {v} => {
println!("Results: {}", v);//1
}
_ => {}
}
}

这就是 Result 这样的类型和 Option功能。

关于rust - 是否可以在不使用 unsafe 或 panicing 的情况下将潜在未初始化的变量标记为良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45371062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com