有没有办法让Rust Generic只接受原始类型?我想稍后迭代值中的位,我理解这只能用于原始类型。
struct MyStruct<T> {
my_property: T // my_property HAS to be a primitive type
}
答案 0 :(得分:5)
我相信你能得到的最接近的是Primitive
特征,它是为内置数字类型实现的。它是几个其他数字特征的组合,最终允许对这些值进行比特摆弄。您可能还需要添加BitAnd
/ BitOr
/等。特征,因为Primitive
似乎不允许这些操作:
fn iter_bits<T: Primitive+BitAnd<T, T>+BitOr<T, T>>(x: T) { /* whatever */ }
答案 1 :(得分:1)
由于您似乎有自定义要求,因此您可以使用具有所需特定功能的自定义特征,例如。
trait BitIterate {
/// Calls `f` on each bit of `self`, passing the index and the value.
fn each_bit(&self, f: |uint, bool|);
}
impl BitIterate for u8 { ... }
impl BitIterate for u16 { ... }
// etc... could be done with a macro
// a non-primitive type which has a sensible way to iterate over bits
impl BitIterate for std::collections::Bitv { ... }
(无论如何,这是“迭代比特”的一种解释。)
然后,使用MyStruct
并且需要可迭代位的函数将使用类似
fn print_bits<T: BitIterate>(x: MyStruct<T>) {
x.my_property.each_bit(|index, bit_value| {
println!("bit #{} is {}", index, bit_value);
})
}