Scala Language
Unidades de manipulación (medidas)
Buscar..
Sintaxis
- Medidor de clase (medidores de val: doble) extiende AnyVal
- tipo metro = doble
Observaciones
Se recomienda usar clases de valor para las unidades o una biblioteca dedicada para ellas.
Tipo de alias
type Meter = Double
Este enfoque simple tiene serios inconvenientes para el manejo de la unidad, ya que cualquier otro tipo que sea Double
será compatible con él:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Todas las compilaciones anteriores, por lo que en este caso las unidades solo se pueden usar para marcar los tipos de entrada / salida para los lectores del código (solo la intención).
Clases de valor
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Las clases de valor proporcionan una forma segura para el tipo de codificación de unidades, incluso si requieren un poco más de caracteres para usarlas:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Al extender AnyVal
s, no hay una penalización de tiempo de ejecución por usarlos, en el nivel JVM, esos son tipos primitivos regulares ( Double
s en este caso).
En caso de que desee generar automáticamente otras unidades (como Velocity
aka MeterPerSecond
), este enfoque no es el mejor, aunque hay bibliotecas que también se pueden usar en esos casos: