Сократите объем кода на Rust и повысьте его надежность с помощью универсальных типов.

При разработке приложений всегда существуют уровни неопределенности, которые могут привести к ошибкам, особенно если ваши функции принимают определенные типы аргументов. Чтобы уменьшить количество ошибок из-за неопределенностей, вы можете использовать обобщения. Обобщения предоставляют функциональные возможности для создания классов, функций и структур данных для работы с различными типами.

Используя дженерики, вы можете создавать и определять алгоритмы и структуры данных, которые могут работать с несколькими типами, без написания сложного кода и отдельных реализаций для каждого типа. Обобщения улучшают повторное использование кода и эффективность, сохраняя при этом безопасность типов и производительность.

Использование универсальных типов в Rust

Общий тип Rust может взаимодействовать с другие типы данных Rust. Вы будете определять универсальные типы с помощью угловых скобок (<>), за которыми следуют два или более параметра.

instagram viewer

Вот общий определение структуры который принимает два параметра универсального типа:

структураТочка {
// T и U являются параметрами универсального типа, которые будут использоваться в полях x и y.
// предполагаем при создании экземпляра
х: Т,
у: у,
}

в Точка структура, Т, и U являются параметрами универсального типа.

Вы можете заменить параметры универсального типа любым типом данных при создании экземпляра:

фносновной() {
позволять my_point = Точка { х: Нить::от("привет"), г: Нить::от("мир") };

распечатать!(
«Значение x my_point равно {}, а значение y равно {}».,
my_point.x,
my_point.y
);
}

моя точка переменная является экземпляром Точка структура, инициализированная строковыми типами. Компилятор Rust определяет конкретные типы Т и U на основе значений при создании экземпляра.

Границы признаков для универсальных типов

Универсальные типы Rust могут использовать границы свойств для обеспечения безопасности типов. Черты — это наборы методов, которые типы могут реализовывать для демонстрации определенного поведения, определенного для черты.

Границы признаков указывают, что универсальный тип должен реализовывать один или несколько признаков.

Вот пример универсальной функции, которая возвращает большее из двух значений с привязкой признака, которая гарантирует, что сравниваемые типы реализуют признак:

// Максимум — это трейт, определяющий метод оценки максимума двух
// типы
чертаМаксимум {
фнМакс(себя, другой: Себя) -> Себя;
}

// Реализует трейт `Maximum` для всех типов, которые реализуют
// Черта PartialOrd.
имплPartialOrd> Максимум для Т {
фнМакс(себя, другой: Себя) -> Себя {
// вернуть `self`, если оно больше, чем `other`; в противном случае вернуться
// `другое.`
еслисебя > другое {
себя
} еще {
другой
}
}
}

фносновной() {
позволять а = 5;
позволять б = 10;
позволять наибольший = Максимум:: max (a, b);
распечатать!("Наибольшее значение равно {}", самый большой);
}

Максимум черта имеет Макс метод, который возвращает большее из двух значений одного типа. Любой тип, реализующий PartialOrd черта реализует Максимум черта.

Макс метод принимает два значения Себя тип — относится к типу, реализующему Максимум trait — и сравнивает значения.

основной функция сравнивает две переменные, используя Макс метод и печатает самый большой.

Ограничения для универсальных типов

Ограничения аналогичны границам свойств, но они позволяют указать дополнительные требования к типам, которые вы используете в качестве параметров типов.

Если вы хотите создать универсальную функцию, которая принимает типы для преобразования строк, вы можете использовать ограничение, чтобы гарантировать, что параметр типа реализует трейт.

// ToString — трейт с методом преобразования строки
чертаНанизывать {
фннанизывать(&себя) -> Нить;
}

// to_string — это универсальная функция, которая принимает значение любого типа,
// реализует трейт ToString
фннанизыватьНанизывать>(значение: Т) -> Нить {
значение.to_string()
}

нанизывать параметр value должен реализовывать Нанизывать особенность, которая гарантирует, что вы можете преобразовать значения типа Т нанизывать нанизывать метод.

Универсальные типы полезны для работы с трейтами

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

Универсальные типы удобны для работы со свойствами. Используя универсальные типы, вы можете создавать трейт-объекты, которые работают с любым типом, реализующим трейт, чтобы сделать ваши методы более гибкими.