2014-12-28 41 views

回答

8

據我所知,這需要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相同的空間量 - 在編譯代碼時,包裝類型會被有效擦除。類型檢查器確保在該點之前所有東西都進行網格化。

+0

這或多或少是我猜測我必須要做的。我認爲對於我的行爲,我只是想實際夾緊。因此,如果它們提供其他值,那麼它很好,但是大於100的任何值都會被限制爲100. –

+2

它不需要依賴類型,它們用於鏈接符號(表示運行時值)以鍵入參數值並且更復雜。 Ada沒有依賴類型,但可以定義這種自定義積分(內置於語言中),而C++具有非類型模板參數以實現類似的效果。 –

+1

@MatthieuM。謝謝!這個概念是否有一個通用名稱?當我遇到它時,我被告知它是「依賴類型」。我想知道真名(如果有的話)! – Shepmaster

相關問題