gpt4 book ai didi

generics - 使用 Rust 空类型作为通用绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 08:09:31 25 4
gpt4 key购买 nike

如何将 Rust 泛型类型限制为空类型?我需要创建一个具有可选值的类型,这样如果泛型类型是 (),它就不会使用任何内存。这是一个简单的示例 - Data 可以是 i32, () (4 字节),也可以是 i32, i32 (8 字节)。这两种情况都有一个 add() 。我收到此错误(这是有道理的,但不确定如何避免它)。我需要处理所有有效的数字类型。

error[E0119]: conflicting implementations of trait `std::ops::Add` for type `Data<(), ()>`
...
note: upstream crates may add a new impl of trait `num_traits::Num` for type `()` in future versions
use num_traits::Num;

trait MyNumericType: Num {}
impl<T: Num> MyNumericType for T {}

struct Data<T1: MyNumericType, T2> {
a: T1,
b: T2,
}

impl<T: MyNumericType> Add for Data<T, ()> {
type Output = Self;

fn add(self, other: Self) -> Self {
Self {
a: self.a + other.a,
b: (),
}
}
}

impl<T: MyNumericType> Add for Data<T, T> {
type Output = Self;

fn add(self, other: Self) -> Self {
Self {
a: self.a + other.a,
b: self.b + other.b,
}
}
}


impl<T1: MyNumericType,T2> Data<T1, T2> {
fn new(a: T1, b: T2) -> Self {
Self { a, b }
}
}

fn main() {
let r1 = Data::new(1, 2) + Data::new(3, 4);
let r2 = Data::new(1, ()) + Data::new(2, ());
}

最佳答案

问题是您无法控制 ()键入,这样某人就可以在您完全不知情且没有恶意的情况下写出 impl这会破坏你的代码。 Rust 禁止这种远距离操作。

幸运的是,()是一个非常简单的类型。所以我们可以自己制作。

#[derive(Clone, Copy)]
struct MyUnit;

MyUnit() 基本相同只是它在的 crate 中,而不是Rust的stdlib,也不是其他人的 crate 。如果有人过来写下 impl对于 MyUnit ,那么他们一定已经将你的 crate 作为依赖项,从而意识到了风险。然后写下你的 impl s 表示为 Data<T, MyUnit>而不是Data<T, ()> 。它仍然是零大小类型,因此受到与 () 相同的所有优化。 .

关于generics - 使用 Rust 空类型作为通用绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71245164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com