22 · Expressões Temporais
Dimensões e escalas de unidades
Declare unidades base, dimensões derivadas e escalas exatas com @unit. Multiplicação e divisão derivam dimensões; as converte apenas dimensões compatíveis e verifica representabilidade. Sufixos de duração mantêm o comportamento em milissegundos fora de um contexto dimensional.
Nesta página
Declare unidades base, dimensões derivadas e escalas exatas com @unit. Multiplicação e divisão derivam dimensões; as converte apenas dimensões compatíveis e verifica representabilidade. Sufixos de duração mantêm o comportamento em milissegundos fora de um contexto dimensional.
Exemplo completo
Dimensões e escalas de unidades.
dimensional_units.zolo
// Exact dimensional scales; standalone durations retain milliseconds.
@unit("m", base: true) newtype Meters(decimal) where |v| v >= 0d
@unit("km", of: Meters, scale: 1000d) newtype Kilometers(decimal)
@unit("s", base: true, duration: true) newtype Seconds(decimal)
@unit("h", of: Seconds, scale: 3600d, duration: true) newtype Hours(decimal)
@unit("kph", dimension: Kilometers / Hours) newtype Kph(decimal)
@unit("kmh", dimension: Kilometers * Hours) newtype Kmh(decimal)
fn main() {
let distance = 2km as Meters
assert(distance.unwrap() == 2000d)
print(distance.unwrap())
let speed = 80km / 2h
let displayed = speed as Kph
assert(displayed.unwrap() == 40d)
print(displayed.unwrap())
let covered = (speed * 2h) as Kilometers
assert(covered.unwrap() == 80d)
print(covered.unwrap())
let reverse = (2h * 80km) as Kmh
assert(reverse.unwrap() == 160d)
print(reverse.unwrap())
assert(((2km / 500m) as decimal) == 4d)
print((2km / 500m) as decimal)
let wait = 2h
assert(wait == 7_200_000)
print(wait)
let hours: Hours = 2h
assert(hours.unwrap() == 2d)
print(hours.unwrap())
let nano: Seconds = 1ns
assert(nano.unwrap() == 0.000000001d)
print(nano.unwrap())
assert(1ns == 0)
print(1ns)
let clock = 90_061_000
print("{clock as h}:{clock as min}:{clock as s}:{clock as ms}")
}
main()
Regras e comportamento
Validação, schemas e unidades · Documentação
A partir de um checkout do repositório:
zolo examples/features/dimensional_units.zolo
Veja também