Методы и примеры использования трейтов и границ в Rust

Фраза «armanriazi•rust•trait•bound», по-видимому, представляет собой комбинацию ключевых слов, связанных с языком программирования Rust. Вот некоторые методы в Rust, связанные с типажами и границами, а также примеры кода:

  1. Реализация признака для структуры:

    trait Printable {
       fn print(&self);
    }
    struct MyStruct {
       data: i32,
    }
    impl Printable for MyStruct {
       fn print(&self) {
           println!("Data: {}", self.data);
       }
    }
    fn main() {
       let my_struct = MyStruct { data: 42 };
       my_struct.print();
    }

    Этот код определяет признак Printableи реализует его для структуры MyStruct. Метод printопределен в типаже и реализован для MyStruct, что позволяет экземплярам MyStructвызывать метод print..

  2. Использование границ признаков в параметрах функции:

    trait Summable {
       fn sum(&self) -> i32;
    }
    fn calculate_sum<T: Summable>(items: &[T]) -> i32 {
       let mut result = 0;
       for item in items {
           result += item.sum();
       }
       result
    }
    struct MyNumber(i32);
    impl Summable for MyNumber {
       fn sum(&self) -> i32 {
           self.0
       }
    }
    fn main() {
       let numbers = vec![MyNumber(1), MyNumber(2), MyNumber(3)];
       let total_sum = calculate_sum(&numbers);
       println!("Total Sum: {}", total_sum);
    }

    В этом примере функция calculate_sumпринимает срез любого типа, реализующий признак Summable. Привязка типажа T: Summableгарантирует, что функцию можно вызывать только с типами, в которых реализован метод sum.

  3. Использование границ признаков в общих структурах:

    trait Printable {
       fn print(&self);
    }
    struct Wrapper<T: Printable> {
       item: T,
    }
    impl<T: Printable> Wrapper<T> {
       fn print_item(&self) {
           self.item.print();
       }
    }
    struct MyStruct {
       data: i32,
    }
    impl Printable for MyStruct {
       fn print(&self) {
           println!("Data: {}", self.data);
       }
    }
    fn main() {
       let my_struct = MyStruct { data: 42 };
       let wrapper = Wrapper { item: my_struct };
       wrapper.print_item();
    }

    Этот код показывает общую структуру Wrapper, которая принимает параметр типа Tс привязкой к признаку T: Printable. Экземпляр структуры может быть создан только с типом, который реализует признак Printable.