這是我損壞的示例代碼。請注意,我只想將值加倍并允許任何知道如何乘法的東西。
fn by_two<T: Mul<Output = T>>(x: T) -> T {
x * 2
}
uj5u.com熱心網友回復:
我認為你遇到的問題是你需要說出你正在乘以什么。如果未指定則2默認為 an ,所以這里是那個例子:<integer>i32
fn by_two<T: Mul<i32, Output=T>>(x: T) -> T {
x * 2
}
或者,您可以將結果留給特征。這通常*相當于只使用x * 2而不呼叫函式。
fn by_two<T: Mul<i32>>(x: T) -> <T as Mul<i32>>::Output {
x * 2
}
但是,這不適用于大多數型別,因為 Rust 通常期望原語與相同型別的其他私有數相乘。我們可以將其更改為 useFrom<i32>以使其更具包容性。
fn by_two<T: Mul From<i32>>(x: T) -> <T as Mul>::Output {
x * T::from(2)
}
在這一點上,您可能會注意到問題。我們需要弄清楚“2”是什么型別,以便它可以與 相乘T。該From<i32>解決方案適用于原始型別,但如果您嘗試將向量或矩陣插入函式中,您將開始遇到困難。一種解決方案是添加一個單獨的泛型以允許用戶指定乘以什么。
fn by_two<T: Mul<K>, K: From<i32>>(x: T) -> <T as Mul<K>>::Output {
x * K::from(2)
}
然而,這開始變得有點麻煩了。與以前的版本不同,我們不能讓編譯器推斷要使用的型別,K因為可能有多種型別可以滿足對K.
一個不能完全解決我們的問題但可能對我們有所幫助的選擇是使用像num-traits. 雖然老實說,這實際上與示例 2 大致相同,但具有更廣義的 2 概念。
use num_traits::identities::One;
fn by_two<T: One Add<Output=T>>(x: T) -> T {
x * (T::one() T::one())
}
你有很多選擇,但沒有一個是包羅萬象的。如果您想讓匹配盡可能通用,您可能最好先撰寫函式,然后確定值必須滿足哪些數學屬性才能使其作業。您可以num-traits用于基本特征界限,例如區分浮點數和整數。然后對于更復雜的概念,我建議使用alga.
uj5u.com熱心網友回復:
嗯……什么是二?例如,如果我將乘法定義Color為混合兩種顏色,那么將一種顏色乘以 2 意味著什么?
解決此問題的最簡單方法是選擇兩個適合的非常小的資料型別(例如u8)并接受任何T可以(嘗試)轉換的資料型別u8:
fn by_two<T: Mul<Output = T> TryFrom<u8>>(x: T) -> T {
x * 2.try_into().ok().expect("could not convert two into T")
}
更通用(但繁瑣)的方法是使用numcrate,并接受任何可以相乘的東西,并且有一個 , 的概念One,One One用作兩個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464881.html
上一篇:在C中編程泰勒級數時出現總線錯誤
下一篇:如何在圓周上找到一定距離的點?
