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:



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow