在导入类型时简化impl的长命名空间会引入歧义吗?

时间:2017-05-16 00:12:35

标签: rust

有没有办法简化以下代码的命名空间?

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可能会导致命名空间歧义。

暂时/本地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的方法。

1 个答案:

答案 0 :(得分:3)

  

因为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;