Angenommen, ich habe eine Funktion, die ein Argument vom Typ u16
akzeptiert. Gibt es eine elegante Möglichkeit, einen benutzerdefinierten Datentyp zu definieren, der sich genau wie ein u16
verhält, aber nur Werte zwischen 0 und 100 hat?Datentyp, der nur einen Bereich von Werten annimmt
Antwort
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.
- 1. Wie man einen Anruf von adb annimmt
- 2. Kategorien an einen Bereich von Werten (Prozentsätzen) anhängen und sortieren?
- 3. Bereich von Zeichenart-Werten in C
- 4. Excel-Bereich mit bestimmten Werten
- 5. Der einfachste Weg, IP-Adresse gegen einen Bereich von Werten zu prüfen mit C#
- 6. Refactoring-Bedingung mit einem Bereich von Werten
- 7. Benannter Bereich mit mehreren Werten
- 8. Versuch, einen Bereich von Werten auf der X-Achse in R zu gruppieren
- 9. Haskell Binärbaum mit Werten nur in Blättern
- 10. T-SQL 2005: Übergeben von NULL-Werten über XML-Datentyp
- 11. Gibt es einen Namen für einen Datentyp, der zu einem Set gehören kann?
- 12. Swift Bereich Operator mit zwei unbekannten Werten
- 13. wie einen Referenz-Datentyp
- 14. Laravel - Wie erstellt man einen Bereich mit einer Reihe von Werten?
- 15. Aggregation von Werten in einem bestimmten Bereich (Intervall) mit SPARQL?
- 16. Bereich: Anwenden von Formatierung auf einen Unterabschnitt im Bereich
- 17. Funktion Testwert in einem Bereich von Werten und Rückgabewert
- 18. einen Datentyp überladen oder einen ähnlichen verwenden?
- 19. JS: Wie kann ein Bereich von Werten während der Verwendung von Math.random() ausgeschlossen werden?
- 20. Controller-Bereich von der Direktive
- 21. Array von Hex-Werten wie Bereich ('a', 'z')
- 22. MySQL und CASE WHEN mit einem Bereich von Werten
- 23. Schleife durch Div-Klasse, um einen Bereich von Werten zu erhalten
- 24. Datentyp der Schlüssel und Werte von IReadOnlyDictionary
- 25. Zurückgeben der Zeile unter einen definierten Bereich
- 26. Einen Bereich mit einem App-Bereich verschmelzen
- 27. Kopieren von Werten aus dem übergeordneten Bereich in den Richtlinienbereich
- 28. Wie man einen Bereich von der Tabelle in schematiq
- 29. lodash _.enthält einen von mehreren Werten in der Zeichenkette
- 30. Machen Sie einen Bereich von Zellen gleich einem anderen Bereich von Zellen in verschiedenen Arbeitsmappen
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. –
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. –
@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