Rust 中的绝对值函数

Absolute value function in Rust

在这个基本的 Rust 程序中,一个函数计算一个整数的绝对值,而 main() 帮助完成一个带有结果的语句:

fn main() {
    let value = abs(-4);
    println!("{}.", value);
}

fn abs(x: i32) -> i32 {
    print!("The abs value of {} is ", x);

    if x > 0 {
        return x;
    } else {
        -x
    }
}

有没有办法将整个语句 "The abs value of... is..." 正确打印到 abs() 函数中?我尝试

失败
println!("The abs value of {} is {} ", x, x);

这总是打印 x 参数的值(例如 -4、-4),所以它是不正确的。

并与

println!("The abs value of {} is {} ", x, abs(x));

但是在这里,出于某种原因,Rust 对递归不满意,在编译时发出警告,然后 运行 程序不执行。

尝试this避免递归:

fn main() {
    let value = abs(-4);
    println!("{}.", value);
}
fn abs(x: i32) -> i32 {
    let y = if x >= 0 { x } else { -x };
    println!("The abs value of {} is {} ", x, y);
    y
}

输出:

The abs value of -4 is 4
4.

基本类型有内置的 .abs() 方法,例如 i8, i16, i32, i64, i128, f32, 和 f64

assert_eq!(10i32.abs(), 10);
assert_eq!((-10i32).abs(), 10);

溢出行为

The absolute value of i32::min_value() cannot be represented as an i32, and attempting to calculate it will cause an overflow. This means that code in debug mode will trigger a panic on this case and optimized code will return i32::min_value() without a panic.

以下代码,在debug mode (and returns -128 in release模式下会出现panic):

fn main() {
    let a = -128_i8;
    println!("{}", a); // -128
    let b = a.abs();
    println!("{}", b); // -128
}

由于 abs(-2_147_483_648_i32)2_147_483_648_u32,您可以 return u32 而不是 i32

fn abs(x: i32) -> u32 {
    if x >= 0 {
        x as u32
    } else if x == std::i32::MIN {
        2_147_483_648_u32
    } else {
        -x as u32
    }
}
fn main() {
    let value = abs(std::i32::MIN); // i32::min_value() // -2_147_483_648i32
    println!("{}.", value); // 2147483648
}

Output:

2147483648

绝对值法为already defined;你不需要自己实现它

fn main() {
    let value = abs(-4);
    println!("{}.", value);
}

fn abs(x: i32) -> i32 {
    let val = x.abs();
    println!("The abs value of {} is {}", x, val);
    val
}