如何將 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, ());
}
uj5u.com熱心網友回復:
問題是您無法控制()型別,因此有人可以在您完全不知道且沒有惡意的情況下撰寫impl破壞您的代碼的代碼。Rust 遠距離禁止這種行為。
幸運的是,()是一個非常簡單的型別。所以我們可以自己做。
#[derive(Clone, Copy)]
struct MyUnit;
MyUnit基本上與它相同,()只是它在您的板條箱中,而不是 Rust 的標準庫,而不是其他人的板條箱。如果有人出現并撰寫了implfor MyUnit,那么他們必須已經將您的 crate 作為依賴項,因此他們意識到了風險。然后只需將您impl的 s寫成 sData<T, MyUnit>而不是Data<T, ()>。它仍然是一個大小為零的型別,因此受到所有與().
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437848.html
