Превратить вышестоящую структуру в черту - PullRequest
1 голос
/ 10 апреля 2020

Мне нужно взаимодействовать с некоторым исходным кодом, который предоставляет интерфейс, который может быть особенностью, но вместо этого реализован непосредственно в структуре. Я хотел бы вытащить этот интерфейс в черту, чтобы мой код мог поддерживать альтернативные реализации. На самом деле это можно сделать, но это не особенно эргономично 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 способ справиться с этим?

...