Могу ли я использовать псевдоним с полным синтаксисом? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть некоторый код, где у меня есть много экземпляров полностью определенного синтаксиса;в качестве примера:

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(...)

Обратите внимание, что эта ошибка не возникает, потому что на самом деле существует несколько реализаций определения некоторой черты (котороеэто то, что FQS должен обрабатывать, в соответствии с Rust Programming Language ).

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В вашем примере вы можете переименовать некоторые части, чтобы вы могли ссылаться на них без конфликтов в сокращенной форме:

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;
}
0 голосов
/ 05 октября 2018

Нет, нет способа присвоить псевдоним полному синтаксису.Это не имеет смысла для меня, поскольку весь пункт этого синтаксиса должен быть полностью однозначным.


Все это предполагает, что вам действительно нужен полностью определенный синтаксис.Как видно из названия, обычно есть более короткие способы написания кода.Все они эквивалентны, если в области действия отсутствуют другие черты, определяющие to_string, а сам тип не реализует метод с тем же именем:

<i32 as ToString>::to_string(&42);
ToString::to_string(&42);
i32::to_string(&42);
42.to_string();

См. Также:

...