База Hintsage

Traits и generics

Traits, bounds, generics, associated types и dispatch.

Практика

Вопросы: Traits и generics

В API объект должен поддерживать оба независимых трейта. Разберите, допустим ли такой trait object и как выразить эту границу корректно:

trait Readable {
    fn read(&self) -> String;
}

trait Writable {
    fn write(&mut self, data: &str);
}

fn process(value: &mut (dyn Readable + Writable)) {
    value.write("data");
    println!("{}", value.read());
}

В библиотечном API проверьте, достаточно ли bound трейта для вызова clone у ассоциированного типа без повторения ограничения:

trait Container {
    type Item: Clone;
    fn item(&self) -> Self::Item;
}

fn duplicate<C: Container>(container: C) -> (C::Item, C::Item) {
    let value = container.item();
    (value.clone(), value)
}

Скомпилируется ли функция duplicate?

Программирование RustTraits и genericsРазработчик библиотек на Rust

Проверьте, скомпилируется ли вызов обобщённой функции для Box<dyn Describe>, и объясните результат.

trait Describe {
    fn describe(&self) -> &'static str;
}

struct Item;
impl Describe for Item {
    fn describe(&self) -> &'static str { "item" }
}

fn inspect<T: Describe>(value: T) {
    println!("{}", value.describe());
}

fn main() {
    let boxed: Box<dyn Describe> = Box::new(Item);
    inspect(boxed);
}
Программирование RustTraits и genericsRust-разработчик системного ПО

Показано 120 из 49