2 6 Операторы над типами

### Сужение типов

let a : i8 = 5;
let b : i16 = a; // ok - расширение диапазона

let a : i16 = 10;
let b : i8 = a; // тоже ok  - число в своих пределах и оно известно

let a : i16 = func();
let b : i8 = a // warning - сужение типа

let a : i16 = 10;
let b : i8  = a.byte[0]; // ok - взятие части байт
let c : i8  = a.byte.any; 

type()

В языке можно брать тип от переменных.

let a : int = 10;
let aType : type = type(a);
let b : aType = 20;

println!("{} {}", a, b);
// 10 20

sizeof()

Можно брать размер переменной, если это возможно.

let a : int64;
let sz = sizeof(a);
println!(sz); // 4

sizeof::bit()

Можно также брать размер переменной в битах (только для int).

let a : int64;
let sz = sizeof::bit(a);
println!(sz); // 64

count()

Размер в элементах.

Граничные значения и проверка

Можно задать граничное значение типа для проверки.

let a : int {@ >= 0 and @ < 100};
a = 50;
a = 90;
a = 0;
a = 120;  // Ошибка
a = -100; // Ошибка

unique

Ключевое слово unique защищает переменную от обладания такого же значения переменной в другом месте кода и другой переменной. Это упрощает реализацию умных указателей.