我想知道是否可以区分Rust中的signed和unsigned int。在std::num
我们有Int
,UnsignedInt : Int
和SignedInt : Int + Neg
,因此这两者并不相互排斥。
在最简单的情况下,是否可以编写一个简单函数fn<T: Int>is_signed(value: T) -> bool
,当传递有符号值时(例如i32
),该函数将返回true?有没有更好的方法呢?
编辑以响应下面的评论:一个真实的例子是包装C FFI,其中返回有符号整数类型的函数通过返回-1
来指示错误,而返回uint的函数通过返回{{1来指示错误(这个,加上它让我对在Rust中这样做的惯用方法感兴趣)。
答案 0 :(得分: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
}
然后使用它:
is_signed(5i)
或者如果您从x
删除不需要的参数is_signed
:
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 }
}