[英]Why doesn't the Unsigned trait automatically give e.g. the One trait in Rust?
我想編寫形式的通用函數
fn my_function<T: num::Unsigned>(T: number) -> T
為了將它們用於所有未簽名的 integer 類型,所以u8
- u128
。 但是,我經常想做類似的事情
let n = number + 1;
或者
let mut n = number;
number -= 1;
在 function 體內。 現在,每次我使用類似的東西時, Rust 都會告訴我std::ops::SubAssign
-trait、 std::cmp::PartialOrd
-trait 等沒有為T
實現。
有沒有一種簡單的方法可以指定我的號碼只是u8
- u128
類型之一,因此享有所有這些特征? 為什么 Rust 編譯器不清楚這一點,即沒有PartialOrd
特征的Unsigned
類型的示例是什么?
編輯:澄清一下:我想用一種方式來表達“ T
必須有一種類型u8
... u128
(也許還有BigUInt
)”,然后讓 Rust 自動看到“因為T
是其中一種類型,必須為T
實現以下特征: std::cmp::PartialOrd
, std::ops::SubAssign
,..."
相反, T: Unsigned
確實意味着T: One
。 Unsigned
是Num
的超級特征,它是Zero
、 One
等的超級特征:
pub trait Unsigned: Num { }
pub trait Num: Zero + One + NumOps<Self, Self> + PartialEq<Self> { ... }
要理解的關鍵是1
與T::one()
不同。 這適用於例如:
use num::Unsigned; // 0.4.0
fn my_function<T: Unsigned>(number: T) -> T {
number + T::one()
}
NumOps
特征意味着定義了各種算術運算符,但僅限於T
s 之間。 文字1
可能不是T
, T
可能類似於BigUint
。
我喜歡說“
T
必須具有類型之一u8
...u128
(也許BigUInt
)”,然后讓 Rust 自動看到“由於T
是其中一種類型,因此以下特征具有為T
實現:std::cmp::PartialOrd
,std::ops::SubAssign
,..."
這不是特征設計的工作方式。 特征可以在外來類型上實現,所以即使Unsigned
現在只為那些類型實現,我也可以為它們的類型實現它,這些類型不具有u8
... u128
等的所有相同屬性。
相反,您應該限制T
使其具有 function 工作所需的屬性。 所以你必須是明確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.