Объекты характеристик. Как реализовать для объектов характеристик методы других характеристик?

use std::io::Write;
 
fn t_object(x: &mut dyn Write) {
    
    x.write(&[6,7,8,9,10]).ok(); //все прекрасно - добавили элементы в вектор.
    println!("{:?}", x); //ошибка: характеристика std::fmt::Debug не реализована для типа dyn Write
 
}
 
fn main() {
    
    let mut x = vec![1,2,3,4,5];
    
    t_object(&mut x);

}


Ответы (1 шт):

Автор решения: mzabaluev

Реализовать дополнительные типажи (так они называются в переводе описания языка), не определенные в том же крейте, нельзя в силу "сиротского правила". Также нельзя добавлять дополнительные типажи в тип динамического объекта, например, (dyn Write + Debug) (единственное исключение — автоматически реализуемые типажи вроде Send).

Если действительно нужен динамический объект с интерфейсом, объединяющим несколько типажей, можно ввести вспомогательный типаж:

trait MyInterface: Write + Debug {}

impl<T> MyInterface for T where T: Write + Debug {}

fn t_object(x: &mut dyn MyInterface) {
    x.write(&[6,7,8,9,10]).unwrap();
    println!("{:?}", x);
}

→ Ссылка