有没有办法简化以下代码的命名空间?
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
的方法。
答案 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;