"possibly uninitialized variable" 在 `match` 中初始化时

"possibly uninitialized variable" when it is initialized inside `match`

此代码(playground):

fn main() {
    let fruits = "banana";
    let num = 20;
    let result: i32;

    match fruits {
        "banana" => {
            if num > 100 {
                result = num * 3;
            } else if num > 30 {
                result = num * 4;
            } else {
                result = num * 5;
            }
        }
        "apple" => {
            if num > 100 {
                result = num * 16;
            } else if num > 30 {
                result = num * 18;
            } else {
                result = num * 20;
            }
        }

        _ => println!("wrong fruits option"),
    }
    // if num > 100 { result = num * 3; }
    // else if num > 30 { result = num * 4; }
    // else { result = num * 5;}
    println!("{}", result)
}

出现以下错误:

error[E0381]: borrow of possibly-uninitialized variable: `result`
  --> src/main.rs:31:20
   |
31 |     println!("{}", result)
   |                    ^^^^^^ use of possibly-uninitialized `result`
   |
   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)

如您所见,result 已在匹配中初始化,那么为什么编译器会给我一个错误?

改线后

let result : i32;

至 (playground)

let mut result = 0;

代码正在编译并且工作正常。

这也有效 (playground):

fn main() {
    // let fruits = "banana";
    let num = 20;
    let result: i32;

    // match fruits {
    //     "banana" => {
    //         if num > 100 {
    //             result = num * 3;
    //         } else if num > 30 {
    //             result = num * 4;
    //         } else {
    //             result = num * 5;
    //         }
    //     }
    //     "apple" => {
    //         if num > 100 {
    //             result = num * 16;
    //         } else if num > 30 {
    //             result = num * 18;
    //         } else {
    //             result = num * 20;
    //         }
    //     }

    //     _ => println!("wrong fruits option"),
    // }
    if num > 100 {
        result = num * 3;
    } else if num > 30 {
        result = num * 4;
    } else {
        result = num * 5;
    }
    println!("{}", result)
}

result可能未初始化的原因是_案例没有初始化result.

但是,我不认为你的意图是在那种情况下初始化result。这里真正的错误可能是您可能希望 _ 案例成为停止执行的错误案例。但是,您没有告诉它停止执行。

有多种方法可以解决这个问题:

  • _ 案例中添加 returnexit 语句
  • println 替换为 panic
  • 通过向 main 添加 Result return 值然后 return 错误来引入正确的错误处理。

我决定使用 panic 以最少的努力。请注意,在生产中,恐慌应该是最后的解决方案。使用 ResultError 的正确错误处理始终是首选。

所以这是我为使其工作而进行的最小修改:

fn main() {
    let fruits = "banana";
    let num = 20;
    let result: i32;

    match fruits {
        "banana" => {
            if num > 100 {
                result = num * 3;
            } else if num > 30 {
                result = num * 4;
            } else {
                result = num * 5;
            }
        }
        "apple" => {
            if num > 100 {
                result = num * 16;
            } else if num > 30 {
                result = num * 18;
            } else {
                result = num * 20;
            }
        }

        _ => panic!("wrong fruits option"),
    }
    // if num > 100 { result = num * 3; }
    // else if num > 30 { result = num * 4; }
    // else { result = num * 5;}
    println!("{}", result)
}