rust 为什么从 unwrap_or() 提前返回会导致问题

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

我正在尝试解决leetcode上的问题7。问题有点未明确,但从之前提交的错误来看,任何会导致溢出的输入都应该返回 0。为了解决这个问题,我将

pow
替换为
checked_pow
,目的是使用
unwrap_or
如果发生溢出则提前返回。但是,我现在对任何输入都返回 0,并发出警告,表明调用
unwrap_or
之后的任何代码都无法访问。这是为什么?

fn main() {
    println!("{}", reverse(-23));
    println!("{}", reverse(1534236469));
    println!("{}", reverse(1));
}

fn reverse(x: i32) -> i32 {
    let mut working = {
        if x > 0 {
            x
        } else {
            -x
        }
    };
    let mut digits = Vec::new();
    while working > 0 {
        digits.push(working % 10);
        working /= 10;
    }

    let result = digits
        .iter()
        .rev()
        .enumerate()
        .map(|(power, x)| x * (10i32.checked_pow(power as u32).unwrap_or(return 0)))
        .sum();
    if x > 0 {
        result
    } else {
        -result
    }
}

附注我之前已经意识到有更好的方法来解决这个问题,所以请不要评论说我的解决方案不好(我知道它是)。然而,我发布这个问题是因为虽然它远非理想,但我仍然不明白为什么它不起作用。谢谢,

rust return
1个回答
1
投票
Rust 中的 Return 是一个表达式,它会破坏函数的控制流并使其提前返回。正如《Rust Reference》中所读:

返回表达式用关键字 return 表示。计算返回表达式将其参数移动到当前函数调用的指定输出位置,销毁当前函数激活框架,并将控制权转移到调用者框架。

考虑以下示例:

pub fn foo(val: Option<i32>) -> i32 { val.unwrap_or(return 0) }

Option::<T>::unwrap_or
接受一个值

T

 并在 
None
 变体的情况下返回它。重要的是编译器将评估传递的表达式 
before
,检查 
Option 是否为 None
。当编译器尝
遇到
return
变体)。
你可能会问为什么 Rust 允许这样做,因为 
foo
期望一个
val.unwrap_or_else(|| return 0)
但没有给出。这不应该是类型不匹配吗?不。 None 表达式(以及 unwrap_or
i32
)具有类型

never

(也拼写为

return
),它可以强制转换为任何其他类型(请参阅链接文档)。
总结一下。 
break
将从当前函数提前返回,您可能只想使用
continue
    
© www.soinside.com 2019 - 2024. All rights reserved.