Когда вам нужно добавить метод к внешнему типу, единственный вариант - использовать признаки расширения . Это означает, что вы определяете свою собственную черту с любыми необходимыми вам методами и внедряете ее для нужных вам типов.
Когда вам нужно добавить метод ко всем типам, реализующим некоторую внешнюю черту, вы можете использовать ту жешаблон, но вместо того, чтобы перечислять типы напрямую, просто используйте границы черты:
use std::fmt::Debug;
// This is an extension trait.
// You can force all its implementors to implement also some external trait,
// so that two trait bounds essentially collapse into one.
trait HelperTrait: Debug {
fn helper_method(&mut self);
}
// And this is the "blanket" implementation,
// covering all the types necessary.
impl<T> HelperTrait for T where T: Debug {
fn helper_method(&mut self) {
println!("{:?}", self);
}
}
Playground
Та же идея может быть применена к любой внешней черте, так какВы хотите.