Условное соответствие (conditional conformance) в Rust предполагает реализацию трейта для определенного типа только при определенных условиях. Этот механизм обеспечивает детальный контроль над тем, какие типы могут использовать трейт, обеспечивая гибкость кода и одновременно его выразительность.
Рассмотрим небольшой пример:
// трейт преобразования одних единиц в другие
trait Convertible<T> {
fn convert(&self) -> T;
}
// градусы цельсия
struct Celsius(f64);
// градусы по фаренгейту
struct Fahrenheit(f64);
// реализация преобразования для градусов цельсия в градусы фаренгейта
impl Convertible<Fahrenheit> for Celsius {
fn convert(&self) -> Fahrenheit {
Fahrenheit(self.0 * 1.8 + 32.0)
}
}
// реализация преобразования для градусов фаренгейта в градусы цельсия
impl Convertible<Celsius> for Fahrenheit {
fn convert(&self) -> Celsius {
Celsius((self.0 - 32.0) / 1.8)
}
}
fn main() {
let celsius = Celsius(100.0); // градусы цельсия
// преобразование из градусов цельсия в градусы фаренгейта
let converted_fahrenheit: Fahrenheit = celsius.convert();
println!("100°C in Fahrenheit: {:.2}°F", converted_fahrenheit.0);
let fahrenheit = Fahrenheit(212.0); // градусы фаренгейта
// преобразование из градусов фаренгейта в градусы цельсия
let converted_celsius: Celsius = fahrenheit.convert();
println!("212°F in Celsius: {:.2}°C", converted_celsius.0);
}
Трейт Convertible представляет типы, которые можно преобразовать в другие типы. В качестве примера можно привести два типа единиц измерения температуры: Цельсий и Фаренгейт. Трейт Convertible объявляет метод convert для преобразования одних единиц измерения в другие. И мы реализуем этот трейт как для градусов Цельсия, так и для Фаренгейта. Реализации позволяют осуществлять преобразование температуры между двумя единицами изменения.
Внутри функции main создаются переменные, которые представляют градусы Цельсия и Фаренгейта. Для выполнения преобразования между ними применяется метод convert.
Консольный вывод:
100°C in Fahrenheit: 212.00°F 212°F in Celsius: 100.00°C