Scala Language
Jednostki manipulacyjne (środki)
Szukaj…
Składnia
- class Meter (val metres: Double) rozszerza AnyVal
- typ Meter = Double
Uwagi
Zaleca się stosowanie klas wartości dla jednostek lub dedykowanej biblioteki dla nich.
Wpisz aliasy
type Meter = Double
To proste podejście ma poważne wady w obsłudze jednostek, ponieważ każdy inny typ, który jest Double
będzie z nim kompatybilny:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Wszystkie powyższe kompilują, więc w tym przypadku jednostki mogą być używane tylko do oznaczania typów wejść / wyjść dla czytników kodu (tylko intencja).
Klasy wartości
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Klasy wartości zapewniają bezpieczny dla typu sposób kodowania jednostek, nawet jeśli wymagają nieco więcej znaków do ich użycia:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Po rozszerzeniu AnyVal
nie ma kary wykonawczej za ich użycie, na poziomie JVM są to regularne typy pierwotne (w tym przypadku Double
s).
Jeśli chcesz automatycznie generować inne jednostki (takie jak Velocity
vel MeterPerSecond
), to podejście nie jest najlepsze, chociaż istnieją biblioteki, które mogą być również używane w takich przypadkach: