2个版本
| 0.1.1 | 2023年10月5日 |
|---|---|
| 0.1.0 | 2023年10月5日 |
#1040 in 数学
58KB
1K SLoC
oint
oint ('optional int')是Rust的crate,提供了整数类型
oi8,oi16,oi32,oi64,oi128,oisize,ou8,ou16,ou32,ou64,ou128,ousize,
作为类型
Option<i8>,等等。Option<u8>,等等。
算术函数和运算符定义在oint类型上。oint类型上的算术是完全函数。传统上会溢出或恐慌的计算将返回None值。可以将oint视为围绕checked_something()整数函数的便利。oint是一个整数库,它强制执行检查操作。From已实现,可以将oint类型转换为(并从)它们的Option表示。
PartialEq/Eq和PartialOrd/Ord没有按设计实现。`structural_eq`方法使用结构相等进行比较 - 空值等于自身。`indeterminate_eq`方法使用NaN不确定相等进行比较 - 空值不等于自身。
示例
fn factorial(n: ou8) -> ou8 {
match *n {
None => n,
Some(0) => 1.into(),
Some(_) => n * factorial(n - 1),
}
}
palindrome示例整数溢出
use oint::indeterminate_eq;
use oint::ou8;
fn palindrome_overflow(x: u8) -> bool {
let mut rev: u8 = 0;
let mut temp: u8 = x;
while temp != 0 {
rev = (rev * 10) + (temp % 10);
temp = temp / 10;
}
return x == rev;
}
fn palindrome_oint(x: u8) -> bool {
let x: ou8 = x.into();
let mut rev: ou8 = 0.into();
let mut temp: ou8 = x;
loop {
match *temp {
None => unreachable!(),
Some(val) if val == 0 => break,
Some(_) => {
rev = (rev * 10) + (temp % 10);
temp = temp / 10;
}
}
}
return indeterminate_eq!(rev, x);
}
fn main() {
std::panic::set_hook(Box::new(|_| {}));
let panics = std::panic::catch_unwind(|| {
for val in u8::MIN..=u8::MAX {
_ = palindrome_oint(val)
}
})
.is_err();
let _ = std::panic::take_hook();
println!("Did palindrome_oint panic? {}", panics);
std::panic::set_hook(Box::new(|_| {}));
let panics = std::panic::catch_unwind(|| {
for val in u8::MIN..=u8::MAX {
_ = palindrome_overflow(val)
}
})
.is_err();
let _ = std::panic::take_hook();
println!("Did palindrome_overflow panic? {}", panics);
}