Scala Language
Обрабатывающие устройства (меры)
Поиск…
Синтаксис
- class Meter (val meter: Double) расширяет AnyVal
- тип Meter = Double
замечания
Рекомендуется использовать классы значений для единиц или выделенной библиотеки для них.
Тип псевдонимов
type Meter = Double
Этот простой подход имеет серьезные недостатки для обработки элементов, поскольку любой другой тип, который является Double
будет совместим с ним:
type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d
Все перечисленные выше компиляции, поэтому в этом случае единицы могут использоваться только для маркировки типов ввода / вывода для считывателей кода (только для намерения).
Классы значений
case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal
Классы значений предоставляют безопасный тип кодирования единиц, даже если для их использования требуется несколько больше символов:
var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter
Расширяя AnyVal
s, для их использования нет штрафа за выполнение, на уровне JVM это обычные примитивные типы (в данном случае это Double
).
Если вы хотите автоматически генерировать другие единицы (например, Velocity
aka MeterPerSecond
), этот подход не самый лучший, хотя есть библиотеки, которые также могут использоваться в этих случаях: