Сравнение меток вида в Rust
Метка вида создается из типа в угловых скобках и не зависит от конкретного значения в памяти. Две метки для одного и того же типа совпадают, а для разных типов, например целого и строки, уже нет.
Сравним метки для целого и для строки:
use std::any::TypeId;
fn main() {
let int_a = TypeId::of::<i32>();
let int_b = TypeId::of::<i32>();
let text = TypeId::of::<String>();
println!("{}", int_a == int_b);
println!("{}", int_a == text);
}
На экране true и false. Порядок
переменных не меняет метку: важен только
сам тип в скобках.
Тот же прием годится, когда тип задают через псевдоним или оболочку: метка следует за реальным видом в системе типов:
use std::any::TypeId;
type Score = i32;
struct Tag {
name: String,
}
fn main() {
let plain = TypeId::of::<i32>();
let alias = TypeId::of::<Score>();
let tag = TypeId::of::<Tag>();
println!("{}", plain == alias);
println!("{}", plain == tag);
}
Даны типы в одной программе: f64,
bool и снова f64. Скажите,
какие пары меток вида будут равны.
Дана строка:
use std::any::TypeId;
let left = TypeId::of::<i32>();
let right = TypeId::of::<i32>();
Скажите, что напечатает сравнение
left == right.
Дано число:
let num = 2;
Скажите, изменится ли метка вида для
i32, если в программе вместо
этого литерала использовать другое
целое того же типа.