Что, по мнению компилятора, я делаю
Существует модуль с именем 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;
}