我可以别名完全限定的语法吗?

时间:2018-10-05 00:37:44

标签: syntax rust type-alias

我有一些代码,其中有许多完全合格的语法实例;例如:

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;
}

playground

为了避免类似这样的错误

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应该处理该特征)。

2 个答案:

答案 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();

另请参阅: