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

时间:2015-01-13 22:27:13

标签: rust traits

我想知道是否可以区分Rust中的signed和unsigned int。在std::num我们有IntUnsignedInt : IntSignedInt : Int + Neg,因此这两者并不相互排斥。

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

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

1 个答案:

答案 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 }
}