2015-01-13 35 views
4

我想知道是否有可能区分Rust中的signed和unsigned int。在std::num我们有Int,UnsignedInt : IntSignedInt : Int + Neg,所以这两个不是互斥的。如何编写区分signed和unsigned int的泛型函数?

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

编辑回应评论如下:一个真实的例子是包装一个C FFI如该返回符号整数类型的函数返回一个-1而返回的uint功能指示错误通过返回0(这一点,再加上它表示错误让我感兴趣的是在Rust里做什么是一种惯用的方式)。如果从is_signed删除不需要参数x

is_signed(5i) 

或者:

+0

我很好奇,想知道这是什么能力将允许你这样做。 – Shepmaster

+0

@Shepmaster为了清晰起见编辑帖子。谢谢 – aldanor

+0

请注意,'std :: Int'在1.0中已被弃用,并且替换为[isize](http://doc.rust-lang.org/std/primitive.isize.html) –

回答

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<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 } 
} 
+0

我试图做同样的想法(看起来比较干净),但是你能以某种方式实现它来代替'SignedInt'和'UnsignedInt'而不是具体的类型吗? – Shepmaster

+0

@Shepmaster如果你尝试,编译器会抱怨impls冲突。这是有效的,没有什么能阻止你在类型上实现'SignedInt'和'UnsignedInt'。我认为这是我们能做的最好的。 – wingedsubmariner

+0

@wingedsubmariner这是我自然而然地试图做的第一件事,直接使用'SignedInt'和'UnsignedInt'直到实现你所提到的。 – aldanor

相关问题