Объекты характеристик. Как реализовать для объектов характеристик методы других характеристик?
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);
}