rust 为什么unused_assignment在if语句之前?

8gsdolmq  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(198)

我有以下方法,我得到了let mut res = 1.0的unused_assignment警告:

fn my_func(pld: &f64, lambda: &[f64;NUMF]) -> [f64;NUMF] {
    let mut result = [0.0; NUMF];
    for i in 0..NUMF{
        let pdrel = pld / lambda[i];
        let mut res = 1.0;
        if pdrel >= 0.0 {
            res = 1.0;
        } else {
            res = 1.0 - (7.5 * pdrel.abs()).sqrt();
            if res >= 0.0 {
            } else {
                res = 0.0;
            }
        }
        result[i] = res;
    }
    result
}

我知道我可以避免展示。但是我怎样才能写出更“正确”的代码来避免这个警告呢?

2skhul33

2skhul331#

永远不要使用resfirst赋值。这就是为什么Rustc在抱怨。您在下面if-else语句的所有分支中都赋值了它,因此永远不会阅读您赋值的默认1.0。您可以删除赋值,rustc将停止向您发出警告:

fn my_func(pld: &f64, lambda: &[f64;NUMF]) -> [f64;NUMF] {
    let mut result = [0.0; NUMF];
    for i in 0..NUMF{
        let pdrel = pld / lambda[i];
        let mut res;
        if pdrel >= 0.0 {
            res = 1.0;
        } else {
            res = 1.0 - (7.5 * pdrel.abs()).sqrt();
            if res >= 0.0 {
            } else {
                res = 0.0;
            }
        }
        result[i] = res;
    }
    result
}

或者,你可以依赖Rust中每个块都有一个返回值的事实,所以你可以直接从if-else块返回值。然后你不必让res可变,你可能更喜欢:

fn my_func(pld: &f64, lambda: &[f64;NUMF]) -> [f64;NUMF] {
    let mut result = [0.0; NUMF];
    for i in 0..NUMF{
        let pdrel = pld / lambda[i];
        
        let res = if pdrel >= 0.0 {
            1.0
        } else {
            let tmp = 1.0 - (7.5 * pdrel.abs()).sqrt();
            if tmp >= 0.0 {
                tmp
            } else {
                0.0
            }
        };
        
        result[i] = res;
    }
    result
}

相关问题