如何编写区分有符号和无符号 int 的通用函数?

How can I write a generic function that discriminates between signed and unsigned int?

我想知道是否可以在 Rust 中区分有符号和无符号 int。在 std::num 中我们有 IntUnsignedInt : IntSignedInt : Int + Neg,所以这两者并不互斥。

在最简单的情况下,是否可以编写一个简单的函数 fn<T: Int>is_signed(value: T) -> bool,在传递有符号值时 return 为真(例如 i32)?有更好的方法吗?

根据以下评论进行编辑:一个真实世界的例子是包装一个 C FFI,其中 return 有符号整数类型的函数通过 returning a -1 指示错误而函数 returning uints 通过 returning 0 指示错误(这个,加上它让我对 Rust 中的惯用方式感兴趣)。

您可以利用 Int 上的方法来实现 is_signed:

fn is_signed<T: Int>(x: T) -> bool {
    let mv: T = Int::min_value();
    let z: T = Int::zero();
    mv < z
}

然后像这样使用它:

is_signed(5i)

或者,如果您从 is_signed 中删除不需要的参数 x

is_signed<i32>

但是,这不是很有效或不符合习惯。在您检查错误代码的情况下,最好定义一个具有您想要的行为的特征,并为每种可能的类型实现它:

trait IsError {
    fn is_error(self) -> bool;
}

impl IsError for isize {
    fn is_error(self) -> bool { self < 0 }
}

impl IsError for usize {
    fn is_error(self) -> bool { self == 0 }
}