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);
}