如何编写区分signed和unsigned int的泛型函数?

ald*_*nor 5 traits rust

我想知道是否有可能区分Rust中的signed和unsigned int.在std::num我们Int,UnsignedInt : IntSignedInt : Int + Neg,所以这两个是不是相互排斥的.

在最简单的情况下,是否可以编写一个简单的函数fn<T: Int>is_signed(value: T) -> bool,当传递有符号的值时它会返回true(例如i32)?有没有更好的方法呢?

编辑以响应下面的评论:一个真实世界的例子是包装一个C FFI,其中返回有符号整数类型的函数通过返回a -1指示错误而返回uint的函数通过返回指示错误0(这,加上它让我感兴趣的是什么是在Rust中这样做的惯用方法).

win*_*ner 5

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

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

然后使用它像:

is_signed(5i)
Run Code Online (Sandbox Code Playgroud)

或者,如果xis_signed以下位置删除不需要的参数:

is_signed<i32>
Run Code Online (Sandbox Code Playgroud)

然而,这不是非常有效或惯用的.在检查错误代码的情况下,最好使用您想要的行为定义特征,并为每种可能的类型实现它:

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 }
}
Run Code Online (Sandbox Code Playgroud)