Function 铁锈中的绝对值函数

Function 铁锈中的绝对值函数,function,macros,rust,absolute-value,Function,Macros,Rust,Absolute Value,在此程序中,函数计算整数的绝对值,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 } } 有没有办法将整个

在此程序中,函数计算整数的绝对值,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
    }
}
有没有办法将整个语句“的abs值为…”正确打印到abs()函数中?我试过了,但没有成功

println!("The abs value of {} is {} ", x, x);
这总是打印x参数的值(例如-4,-4),因此它是不正确的

println!("The abs value of {} is {} ", x, abs(x));
但在这里,由于某种原因,Rust不喜欢递归,在编译时发出警告,然后不运行程序。

尝试避免递归:

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()
方法,例如。 , , , , , , 以及:

溢出行为
i32::min_value()
的绝对值不能表示为
i32
,尝试计算它将导致溢出。这 意味着调试模式下的代码将在这种情况下触发死机,并且 优化后的代码将返回
i32::min_value()
,不会出现死机

以下代码将在模式下死机(并在模式下返回
-128
):


由于
abs(-2_147_483_648_i32)
2_147_483_648_u32
,您可以返回
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
}
:


绝对值法为;您不需要自己实现它

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
}

谢谢,效果很好。此时,我可以简单地从main调用abs(-4),并删除main中的“let value=”和整个“println!”语句。是:
fn main(){abs(-4);}
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
}
2147483648
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
}