10
比方說,我有一個函數需要一個類型爲u16
的參數。有沒有一種優雅的方式來定義一個自定義數據類型,其行爲完全像u16
,但只有0到100之間的值?數據類型僅適用於一系列值
比方說,我有一個函數需要一個類型爲u16
的參數。有沒有一種優雅的方式來定義一個自定義數據類型,其行爲完全像u16
,但只有0到100之間的值?數據類型僅適用於一系列值
據我所知,這需要Rust999沒有的dependent types。這不需要依賴類型(請參閱評論),但Rust仍不具備所需的支持。
作爲一種變通方法,您可以創建你自己驗證一個NEWTYPE:
#[derive(Debug)]
struct Age(u16);
impl Age {
fn new(age: u16) -> Option<Age> {
if age <= 100 {
Some(Age(age))
} else {
None
}
}
}
fn main() {
let age1 = Age::new(30);
let age2 = Age::new(500);
println!("{:?}, {:?}", age1, age2);
println!("{}, {}", std::mem::size_of::<Age>(), std::mem::size_of::<u16>());
}
當然,它不表現完全相同像u16
,但你不希望它,無論是!例如,一個u16
可以超過100 ...你必須推斷出,如果它是有道理的加/減/乘/除等你的新類型。
需要注意的重要一點是,這種新類型需要佔用與u16
相同的空間量 - 在編譯代碼時,包裝類型會被有效擦除。類型檢查器確保在該點之前所有東西都進行網格化。
這或多或少是我猜測我必須要做的。我認爲對於我的行爲,我只是想實際夾緊。因此,如果它們提供其他值,那麼它很好,但是大於100的任何值都會被限制爲100. –
它不需要依賴類型,它們用於鏈接符號(表示運行時值)以鍵入參數值並且更復雜。 Ada沒有依賴類型,但可以定義這種自定義積分(內置於語言中),而C++具有非類型模板參數以實現類似的效果。 –
@MatthieuM。謝謝!這個概念是否有一個通用名稱?當我遇到它時,我被告知它是「依賴類型」。我想知道真名(如果有的話)! – Shepmaster