如何编写区分有符号和无符号 int 的通用函数?
How can I write a generic function that discriminates between signed and unsigned int?
我想知道是否可以在 Rust 中区分有符号和无符号 int。在 std::num
中我们有 Int
、UnsignedInt : Int
和 SignedInt : Int + Neg
,所以这两者并不互斥。
在最简单的情况下,是否可以编写一个简单的函数 fn<T: Int>is_signed(value: T) -> bool
,在传递有符号值时 return 为真(例如 i32
)?有更好的方法吗?
根据以下评论进行编辑:一个真实世界的例子是包装一个 C FFI,其中 return 有符号整数类型的函数通过 returning a -1
指示错误而函数 returning uints 通过 returning 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
}
然后像这样使用它:
is_signed(5i)
或者,如果您从 is_signed
中删除不需要的参数 x
:
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 }
}
我想知道是否可以在 Rust 中区分有符号和无符号 int。在 std::num
中我们有 Int
、UnsignedInt : Int
和 SignedInt : Int + Neg
,所以这两者并不互斥。
在最简单的情况下,是否可以编写一个简单的函数 fn<T: Int>is_signed(value: T) -> bool
,在传递有符号值时 return 为真(例如 i32
)?有更好的方法吗?
根据以下评论进行编辑:一个真实世界的例子是包装一个 C FFI,其中 return 有符号整数类型的函数通过 returning a -1
指示错误而函数 returning uints 通过 returning 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
}
然后像这样使用它:
is_signed(5i)
或者,如果您从 is_signed
中删除不需要的参数 x
:
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 }
}