我想知道是否有可能区分Rust中的signed和unsigned int.在std::num我们Int,UnsignedInt : Int和SignedInt : Int + Neg,所以这两个是不是相互排斥的.
在最简单的情况下,是否可以编写一个简单的函数fn<T: Int>is_signed(value: T) -> bool,当传递有符号的值时它会返回true(例如i32)?有没有更好的方法呢?
编辑以响应下面的评论:一个真实世界的例子是包装一个C FFI,其中返回有符号整数类型的函数通过返回a -1指示错误而返回uint的函数通过返回指示错误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
}
Run Code Online (Sandbox Code Playgroud)
然后使用它像:
is_signed(5i)
Run Code Online (Sandbox Code Playgroud)
或者,如果x从is_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)