有没有一种方法可以简化以下代码的 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;