2014-12-28 10 views

Antwort

8

Wie ich es verstehe, erfordert das dependent types, die Rust nicht hat. Dies erfordert keine abhängigen Typen (siehe Kommentare), aber Rust hat immer noch nicht die erforderliche Unterstützung.

Als Abhilfe können, könnten Sie eine newtype erstellen, die Sie selbst überprüfen:

#[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>()); 
} 

Natürlich ist es nicht so verhalten, genau wie ein u16, aber Sie wollen es nicht, entweder ! Zum Beispiel kann ein u16 über 100 hinausgehen ... Sie müssten herausfinden, ob es sinnvoll ist, auch Ihren neuen Typ zu addieren/subtrahieren/multiplizieren/teilen usw..

Eine wichtige Sache zu beachten ist, dass dieser neue Typ den gleichen Speicherplatz wie ein u16 nimmt - der Wrappertyp wird effektiv gelöscht, wenn der Code kompiliert wird. Der Typprüfer stellt sicher, dass alles vorher ineinander greift.

+0

Das ist mehr oder weniger das, was ich vermutete. Ich denke für mein Verhalten würde ich eigentlich nur klemmen wollen. Es ist also in Ordnung, wenn sie andere Werte liefern, aber alles über 100 würde an 100 geklammert werden. –

+2

Es erfordert keine abhängigen Typen, die zum Verknüpfen von Symbolen (die Laufzeitwerte darstellen) zum Eingeben parametrischer Werte und etwas komplizierter sind. Ada hat keine abhängigen Typen und lässt Sie dennoch solche benutzerdefinierten Integrale definieren (die in der Sprache integriert sind) und C++ hat nicht-type Template-Parameter, um einen ähnlichen Effekt zu erzielen. –

+1

@MatthieuM. Vielen Dank! Gibt es einen generischen Namen für dieses Konzept? Als ich schon einmal darüber gestolpert war, wurde mir gesagt, es seien "abhängige Typen". Ich würde gerne den richtigen Namen wissen (wenn es einen gibt!). – Shepmaster

Verwandte Themen