Как сказать компилятору Rust, что аннотации типов на самом деле не нужны? - PullRequest
0 голосов
/ 27 февраля 2020
struct MyStruct<T: MyTrait> {
    inner: T,
}

impl<T: MyTrait> MyStruct<T> {
    const MYCONST: u32 = 42;

    pub fn x() {
        println!("x!");
    }
}

pub trait MyTrait {}

Для доступа к MYCONST или x() требуется черта. Если ничего не предоставлено, компилятор жалуется:

error[E0282]: type annotations needed
  --> src/main.rs:42:5
   |
42 |     MyStruct::x();
   |     ^^^^^^^^^^^ cannot infer type for `T`

или

error[E0282]: type annotations needed
  --> src/main.rs:42:20
   |
42 |     println!("{}", MyStruct::MYCONST);
   |                    ^^^^^^^^^^^^^^^^^ cannot infer type for `T`

Есть ли способ сказать компилятору игнорировать необходимость аннотаций типов здесь?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Аннотации типов необходимы - там - это не тип с именем MyStruct. Это не имеет ничего общего с признаками:

struct MyStruct<T> {
    inner: T,
}

impl<T> MyStruct<T> {
    const MYCONST: u32 = 42;

    pub fn x() {
        println!("x!");
    }
}

fn main() {
    MyStruct::x();
}
error[E0282]: type annotations needed
  --> src/main.rs:14:6
   |
14 |      MyStruct::x();
   |      ^^^^^^^^^^^ cannot infer type for type parameter `T`

Определение типа с generi c на самом деле не тип, а конструктор типа . Вы должны заполнить дженерики, чтобы получить тип для доступа к связанным элементам.

2 голосов
/ 27 февраля 2020

В ответ на " Почему нужна аннотация типа?" рассмотрим следующий код:

struct MyStruct<T> {
    inner: T,
}

impl MyStruct<i32> {
    const MYCONST: u32 = 42;

    pub fn x() {
        println!("i32!");
    }
}

impl MyStruct<i64> {
    const MYCONST: u32 = 64;

    pub fn x() {
        println!("i64!");
    }
}


fn main() {
    MyStruct::x();
}

Должен ли он печатать i32 или i64?

...