Условное соответствие трейтов

Последнее обновление: 07.05.2024

Условное соответствие (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
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850