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

### Низ лежащий тип Все абстрактные типы во время выполнения конкретизируются определённым значением. Наример int может стать i32, u64 и т.д. При этом возможно наличие преобразований типов между собой под капотом.

Неявное приведение

Если переменная A относится к надмножеству переменной B приведение A к B будет приводится автоматически. В обратную сторону приведение может не всегда работать и его надо указывать явно.

let mut A : int;
let mut B : i32 = 10;

A = B; // тип A i32
let mut A : int;
let mut B : i32 = 10;

B = A; // Корректность этого будет проверена

Вполне возможно компилятор выдаст ошибку, если решит что под капотом происходит сужающее приведение.

Если мы имеем 2 переменные на одинаковом уровне абстракции например i32 и f32 то для присвоение одной переменной другой обязательно делать это явно если возможна потеря точности.

Дробное и целое

Приведение дробного к целому всегда сопровождается типом приведения floor, ceil, round, trim

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

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

type::common() или type() вернёт тот тип, который прописан. type::concrete() вернёт тип который выведен (может быть выведен 2ды по-разному в зависимости от вызова функции)

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 защищает переменную от обладания такого же значения переменной в другом месте кода и другой переменной. Это упрощает реализацию умных указателей.