我嘗試在 Rust 中創建一個通用函式,它適用于所有浮點型別并使用在f32and上實作的方法f64:
use num_traits::Float;
fn foo<F: Float>( a: F, b: F ) -> F {
return a.rem_euclid( b );
}
當我嘗試編譯此代碼時,編譯器告訴我rem_euclid未定義F:
no method named `rem_euclid` found for type parameter `F` in the current scope
--> src\lib.rs:54:11
|
54 | return a.rem_euclid( b );
| ^^^^^^^^^^ method not found in `F`
如何在通用函式中使用此方法?
uj5u.com熱心網友回復:
這適用于Playground,所以我認為這個函式rem_euclid在 Float trait上不存在。
您也可以創建一個具有您想要的功能的特征。操場
uj5u.com熱心網友回復:
通過查看num_traits的檔案,它不包含rem_euclid.
rem_euclid使用以下內容應該會得到與num_traitsFloat 變數型別相同的結果,并且可以使用。
use num_traits::Float;
fn foo<F: Float>( a: F, b: F ) -> F {
return (a - (a / b).trunc() * b).abs();
}
uj5u.com熱心網友回復:
f32/f64 的歐幾里得模方法在libcore中,它不在Float 特征中
您可以嘗試像這樣實作您的 fn 它的語法可以
trait FloatNumber {
fn rem_euclid(self, rhs: Self) -> Self;
}
impl FloatNumber for f32 {
fn rem_euclid(self, rhs: Self) -> Self {
self.rem_euclid(rhs)
}
}
impl FloatNumber for f64 {
fn rem_euclid(self, rhs: Self) -> Self {
self.rem_euclid(rhs)
}
}
fn foo<T: FloatNumber>(a: T, b: T) -> T {
return a.rem_euclid(b);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/454777.html
上一篇:泛型型別的轉換無法編譯
