Scala Language
Unità di gestione (misure)
Ricerca…
Sintassi
- class Meter (val meter: Double) estende AnyVal
- type Meter = Double
Osservazioni
Si consiglia di utilizzare classi di valore per unità o una libreria dedicata per loro.
Digita gli alias
type Meter = Double
Questo semplice approccio presenta seri inconvenienti per la gestione delle unità, poiché ogni altro tipo di Double
è compatibile con esso:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Tutte le compilazioni di cui sopra, quindi in questo caso le unità possono essere utilizzate solo per marcare i tipi di input / output per i lettori del codice (solo l'intento).
Classi di valore
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Le classi di valore forniscono un modo sicuro per codificare le unità, anche se richiedono un numero leggermente maggiore di caratteri per utilizzarle:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Estendendo AnyVal
s, non vi è alcuna penalità di runtime per utilizzarli, a livello di JVM, quelli sono normali tipi primitivi ( Double
s in questo caso).
Nel caso in cui si desideri generare automaticamente altre unità (come Velocity
aka MeterPerSecond
), questo approccio non è il migliore, anche se ci sono librerie che possono essere utilizzate anche in questi casi: