Мне нужно взаимодействовать с некоторым исходным кодом, который предоставляет интерфейс, который может быть особенностью, но вместо этого реализован непосредственно в структуре. Я хотел бы вытащить этот интерфейс в черту, чтобы мой код мог поддерживать альтернативные реализации. На самом деле это можно сделать, но это не особенно эргономично c:
pub mod upstream_code {
pub struct Foo(());
impl Foo {
pub fn foo(&self) -> &'static str {
"foo"
}
}
impl Default for Foo {
fn default() -> Self {
Foo(())
}
}
}
mod my_code {
pub trait Foo {
fn foo(&self) -> &'static str;
}
impl Foo for super::upstream_code::Foo {
fn foo(&self) -> &'static str {
self.foo()
}
}
pub fn do_something<T: Foo>(t: T) {
println!("foo: {}", t.foo());
}
}
fn main() {
my_code::do_something(upstream_code::Foo::default());
}
В частности, обратите внимание, что мне нужно извергать каждую функцию в виде оболочки внутри блока impl Foo for super::upstream_code::Foo
.
Должен быть лучший путь! Какой самый идиоматический c способ справиться с этим?