2个版本

0.1.1 2023年10月5日
0.1.0 2023年10月5日

#1040 in 数学

MIT/Apache

58KB
1K SLoC

oint

static analysis unit tests codecov

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

无运行时依赖