簡體   English   中英

為什么無符號特征不自動給出例如 Rust 中的 One 特征?

[英]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::PartialOrdstd::ops::SubAssign ,..."

相反, T: Unsigned確實意味着T: One UnsignedNum的超級特征,它是ZeroOne等的超級特征:

pub trait Unsigned: Num { }
pub trait Num: Zero + One + NumOps<Self, Self> + PartialEq<Self> { ... }

要理解的關鍵是1T::one()不同。 這適用於例如:

use num::Unsigned; // 0.4.0

fn my_function<T: Unsigned>(number: T) -> T {
    number + T::one()
}

NumOps特征意味着定義了各種算術運算符,但僅限於T s 之間。 文字1可能不是TT可能類似於BigUint


我喜歡說“ T必須具有類型之一u8 ... u128 (也許BigUInt )”,然后讓 Rust 自動看到“由於T是其中一種類型,因此以下特征具有為T實現: std::cmp::PartialOrdstd::ops::SubAssign ,..."

這不是特征設計的工作方式。 特征可以在外來類型上實現,所以即使Unsigned現在只為那些類型實現,我也可以為它們的類型實現它,這些類型不具有u8 ... u128等的所有相同屬性。

相反,您應該限制T使其具有 function 工作所需的屬性。 所以你必須是明確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM