我有一些代码,其中有许多完全合格的语法实例;例如:
mod hal {
pub trait Backend {
type Device;
}
}
mod back {
pub struct Backend {}
impl ::hal::Backend for Backend {
type Device = i32;
}
}
fn main() {
let d: back::Backend::Device = 0;
}
为了避免类似这样的错误
error[E0223]: ambiguous associated type
--> src/main.rs:16:12
|
16 | let d: back::Backend::Device = 0;
| ^^^^^^^^^^^^^^^^^^^^^ ambiguous associated type
|
= note: specify the type using the syntax `<back::Backend as Trait>::Device`
是否可以使用别名SomeType as SomeTrait
的好方法?然后,无论何时需要此标准语法实例,我都可以编写:
<S>::associated_fn(...)
请注意,不会发生此错误,因为实际上有一些特征定义的多种实现(根据 The Rust Programming Language ,FQS应该处理该特征)。
答案 0 :(得分:2)
在您的示例中,您可以重命名某些部分,以便您可以以缩写形式引用它们而不会出现冲突:
use hal::Backend;
use back::Backend as BackendImpl;
fn main() {
let d: <BackendImpl as Backend>::Device = 0;
}
您还可以考虑定义类型别名,该别名的访问性不太明显:
mod hal {
pub trait Backend {
type Device;
}
}
mod back {
pub struct Backend {}
pub type Device = i32;
impl ::hal::Backend for Backend {
type Device = Device;
}
}
fn main() {
let d: back::Device = 0;
}
答案 1 :(得分:0)
否,无法别名全限定语法。这样做对我来说没有任何意义,因为此语法的整个要点都是完全明确的。
所有这些都假定您实际上需要完全限定的语法。顾名思义,通常有较短的编写代码的方法。如果没有其他定义to_string
的特征在范围内,并且类型本身未实现相同名称的方法,则这些都是等效的:
<i32 as ToString>::to_string(&42);
ToString::to_string(&42);
i32::to_string(&42);
42.to_string();
另请参阅: