Почему использование f32 :: consts :: E приводит к ошибке E0223, а std :: f32 :: consts :: E - нет? - PullRequest
0 голосов
/ 31 января 2019

Если я напишу:

let x = f32::consts::E;

Я получу ошибку:

error[E0223]: ambiguous associated type
  --> src/main.rs:32:21
   |
32 |             let x = f32::consts::E;
   |                     ^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<f32 as Trait>::consts`

Но если я вместо этого напишу:

let x = std::f32::consts::E;

Тогда все в порядке.Сообщение об ошибке сбивает с толку, потому что, насколько я понимаю, f32 - это конкретный конкретный тип, а не черта.Я не уверен, почему я использовал какой-то специальный синтаксис черт.

Что, по мнению компилятора, я делаю и почему помогает мое исправление?

1 Ответ

0 голосов
/ 31 января 2019

Что, по мнению компилятора, я делаю

Существует модуль с именем f32 и существует тип с именемf32.По умолчанию этот тип доступен везде, а модуль отсутствует.

Без дополнительных импортов f32::foo лучше всего понимается компилятором как связанный тип для типа f32,но нет такого типа.Предполагается, что связанный тип исходит из черты, и предлагает вам более четко определить, что это за черта.

Когда вы делаете std::f32, путь приводит модуль в область действия и вложенный модуль constsзатем можно найти.Вы также можете сделать:

use std::f32;
let x = f32::consts::E;

Это может произойти для любого типа, но обычно типы и модули используют разные стили именования (UpperCamelCase против snake_case):

struct my_type;

mod other {
    pub mod my_type {
        pub mod consts {
            pub const ZERO: i32 = 0;
        }
    }
}

fn example() {
    my_type::consts::ZERO;
}
error[E0223]: ambiguous associated type
  --> src/lib.rs:12:5
   |
12 |     my_type::consts::ZERO;
   |     ^^^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<my_type as Trait>::consts`

Бывает, что примитивы используют все строчные буквы.

Вот некоторый код (сомнительной полезности), который показывает, как на самом деле может быть связан связанный тип:

struct Consts;

impl Consts {
    const E: char = 'e';
}

trait Example {
    type consts;
}

impl Example for f32 {
    type consts = Consts;
}

fn example() {
    <f32 as Example>::consts::E;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...