Scala Language
Hanteringseenheden (maatregelen)
Zoeken…
Syntaxis
- klasse Meter (valmeters: dubbel) verlengt AnyVal
- type Meter = Dubbel
Opmerkingen
Het wordt aanbevolen om waardeklassen voor eenheden te gebruiken of een speciale bibliotheek daarvoor.
Typ aliassen
type Meter = Double
Deze eenvoudige aanpak heeft ernstige nadelen voor de bediening van de unit, omdat elk ander type dat een Double
is, ermee compatibel zal zijn:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Alle bovenstaande compilaties, dus in dit geval kunnen eenheden alleen worden gebruikt voor het markeren van invoer- / uitvoertypen voor de lezers van de code (alleen de bedoeling).
Waardeklassen
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Waardeklassen bieden een typeveilige manier om eenheden te coderen, zelfs als ze wat meer tekens nodig hebben om ze te gebruiken:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Door AnyVal
s uit te breiden, is er geen runtime-boete voor het gebruik ervan, op JVM-niveau, dat zijn reguliere primitieve typen (in dit geval Double
s).
Als u automatisch andere eenheden (zoals Velocity
aka MeterPerSecond
) wilt genereren, is deze aanpak niet de beste, hoewel er in die gevallen ook bibliotheken kunnen worden gebruikt: