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
}
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
}
在这个基本的 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 ani32
, 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 returni32::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
}
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
}