我正在尝试解决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
}
}
附注我之前已经意识到有更好的方法来解决这个问题,所以请不要评论说我的解决方案不好(我知道它是)。然而,我发布这个问题是因为虽然它远非理想,但我仍然不明白为什么它不起作用。谢谢,
返回表达式用关键字 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
。