有没有一种方法可以简化以下代码的 namespace ?

struct T {...}

impl<'a> From<A::B::C::D::Foo<'a>> for T {
    fn from(x: A::B::C::D::Foo<'a>) -> Self {
        T {...}
    }
}

我不想在当前模块中添加use A::B::C::D::Foo,因为Foo可能会导致 namespace 含糊。

有没有办法暂时/本地为use A::B::C::D::Foo设置impl?看来我只能在函数范围内执行此操作,而不能在impl范围内执行此操作。

目前,我的解决方法是使用虚拟模块。
struct T {...}
mod abc {
    use super::T;
    use A::B::C::D::Foo;


    impl<'a> From<Foo<'a>> for T {
        fn from(x: Foo<'a>) -> Self {
            T {...}
        }
    }
}

如果使用嵌套模块是规范的解决方案,由于模块名称不重要,是否可以定义匿名模块?

注意,我不介意为A::B::C::D::Foo编写一次impl,但是由于from中的类型与impl From中的类型相同,所以我在寻找不必两次写相同的A::B::C::D::Foo的方法。

最佳答案



您可以在导入类型时重命名该类型,以避免产生歧义:

pub mod a {
    pub mod b {
        pub mod c {
            pub mod d {
                pub struct Foo;
            }
        }
    }
}

struct T;

use a::b::c::d::Foo as UniqueName;

impl<'a> From<UniqueName> for T {
    fn from(_: UniqueName) -> Self {
        T
    }
}

fn main() {}

您还可以使用类型别名:
type UniqueName = a::b::c::d::Foo;

10-07 19:09
查看更多