如何在Rust中实现泛型结构的类型约束?

utugiqy6  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(106)

我希望能够在Rust中的泛型结构上放置类型约束。
下面是一些伪代码,解释了它的外观:

struct OrderedFloat<T>
    where T is f64 or f32
{
    value: T
}

字符串
预期目的是为该结构提供impl Ord
我不想直接将impl Ord用于f32f64,这可能会破坏其他行为。
上面的语法无效,它是伪代码。它无法编译。
以下代码也无法编译:

struct OrderedFloat<T>
    where T = f64
{
    value: T
}


如果我理解正确的话,这永远不会起作用,因为where约束适用于 traits not types,而f64是一种类型。
我建议如果有一个特质的概念说“X是f64样的”和“X是f32样的”,这种行为可能是可以实现的。
这样的性状可以是所谓的“标记性状”。
我对Rust编程的这个领域不是特别熟悉,所以我不知道这些想法是否朝着正确的方向发展,或者这是否不是一个可实现的解决方案。

n9vozmp4

n9vozmp41#

你可以这样做:

struct OrderedFloat<T>
    where T: MyMarker
{
    value: T
}

trait MyMarker { }
impl MyMarker for f32 {}
impl MyMarker for f64 {}

fn main() {
    let f: f32 = 3.14;
    let _of = OrderedFloat { value: f };
}

字符串
以上利用了所谓的“标记”性状。

相关问题