Scala Language
Unités de manutention (mesures)
Recherche…
Syntaxe
- classe Meter (val metres: Double) étend AnyVal
- type Meter = Double
Remarques
Il est recommandé d'utiliser des classes de valeur pour les unités ou une bibliothèque dédiée pour celles-ci.
Alias de type
type Meter = Double
Cette approche simple présente de sérieux inconvénients pour la gestion des unités, car tout autre type de Double
sera compatible avec celui-ci:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Toutes les données ci-dessus sont compilées. Dans ce cas, les unités ne peuvent être utilisées que pour marquer les types d'entrée / sortie pour les lecteurs du code (uniquement l'intention).
Classes de valeur
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Les classes de valeur fournissent un moyen sûr d'encoder des unités, même si elles nécessitent un peu plus de caractères pour les utiliser:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
En étendant AnyVal
s, il n'y a pas de pénalité d'exécution pour les utiliser, au niveau de la JVM, ce sont des types primitifs réguliers ( Double
s dans ce cas).
Si vous souhaitez générer automatiquement d'autres unités (comme Velocity
aka MeterPerSecond
), cette approche n'est pas la meilleure, bien qu'il existe des bibliothèques pouvant être utilisées dans ces cas également: