Scala Language
Handling Units (Maßnahmen)
Suche…
Syntax
- Klasse Meter (Wert: doppelt) erweitert AnyVal
- Typ Meter = Doppelt
Bemerkungen
Es wird empfohlen, Werteinheiten für Einheiten oder eine dedizierte Bibliothek für sie zu verwenden.
Geben Sie Aliase ein
type Meter = Double
Dieser einfache Ansatz hat gravierende Nachteile für die Handhabung von Einheiten, da jeder andere Typ, der ein Double
ist, damit kompatibel ist:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Alle obigen Kompilierungen, so dass Einheiten in diesem Fall nur zum Markieren von Eingabe- / Ausgabearten für die Codeleser (nur die Absicht) verwendet werden können.
Wertklassen
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Werteklassen bieten eine typsichere Methode zum Codieren von Einheiten, auch wenn sie etwas mehr Zeichen benötigen, um sie zu verwenden:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Durch die Erweiterung von AnyVal
s besteht keine Laufzeitstrafe für deren Verwendung. Auf JVM-Ebene handelt es sich dabei um reguläre primitive Typen (in diesem Fall Double
s).
Falls Sie automatisch andere Einheiten generieren möchten (z. B. Velocity
aka MeterPerSecond
), ist dieser Ansatz nicht der beste, obwohl es auch Bibliotheken gibt, die in diesen Fällen verwendet werden können: