Uważa się, że dobrą praktyką jest #[derive(Debug)]
dla większości struktur tworzonych w celu ułatwienia debugowania. Nie jest to jednak możliwe, jeśli twoja struktura zawiera typ bez Debug
, taki jak cechy. Ale jeśli cecha jest pod moją kontrolą, czy jest coś, co mogę zrobić, aby umożliwić użytkownikom implementację tej cechy w komunikacie debugowania?Jak zapewnić domyślną implementację debugowania?
mogę wymagać, aby osoby, które wdrażają moją cechę również wdrożyć Debug
, ale nie lubię konieczności dodać, że dowolny wymóg:
trait MyTrait: Debug { ... }
może po prostu wdrożyć Debug
dla mojego cechy:
trait MyTrait { ... }
impl Debug for MyTrait {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "MyTrait {{ ... }}")
}
}
To nie pozwala implementacji zastąpić Debug
- to prawie tak, jakby funkcja nie jest wirtualna. Jak mogę to sprawić?
use std::fmt;
use std::fmt::{ Formatter, Debug };
#[derive(Debug)]
struct A {
a: Box<Data>,
}
trait Data {}
impl Debug for Data {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "Data{{ ... }}")
}
}
#[derive(Debug)]
struct B(i32);
impl Data for B {}
fn main() {
let a = A{ a: Box::new(B(42)) };
println!("{:?}", a);
}
Wyjścia:
A { a: Data{ ... } }
Czego chcę:
A { a: B(42) }
chcę tylko pierwsze wyjście po B
nie implementuje Debug
.
Brzmi jak [Zezwalaj na cechę, która implementuje jej cechę rodzicielską] (https://github.com/rust-lang/rfcs/issues/1024) jest tym, na co masz ochotę, z domyślną funkcją 'Debuguj' dla twojej cechy . – Lukazoid