Newtype
Newtype - это идиома в Rust, которая позволяет
создать новый тип на основе уже существующего
с помощью tuple-структуры с одним полем.
Такой подход даёт возможность добавить
типовую безопасность, реализовать свои трейты
или скрыть внутреннее представление данных.
Синтаксически newtype объявляется как
struct с одним неименованным полем.
Синтаксис
struct NewType(ExistingType);
Пример
Давайте создадим newtype Meters
на основе типа f64 и выведем значение:
struct Meters(f64);
fn main()
{
let distance = Meters(5.0);
println!("{}", distance.0);
}
Результат выполнения кода:
5.0
Пример
Давайте реализуем метод для newtype Meters,
который возвращает значение в метрах:
struct Meters(f64);
impl Meters
{
fn value(&self) -> f64
{
self.0
}
}
fn main()
{
let distance = Meters(5.0);
println!("{}", distance.value());
}
Результат выполнения кода:
5.0
Пример
Давайте создадим newtype UserId на основе
u32 и newtype UserName на основе
String, чтобы избежать путаницы типов:
struct UserId(u32);
struct UserName(String);
fn main()
{
let id = UserId(1);
let name = UserName(String::from("abcde"));
println!("{}", id.0);
println!("{}", name.0);
}
Результат выполнения кода:
1
"abcde"
Смотрите также
-
ключевое слово
struct,
которое объявляет структуру -
tuple-struct,
на основе которого строится newtype -
derive,
который позволяет автоматически реализовать трейты для newtype -
impl,
который добавляет методы к newtype