Каковы действительные корни пути в ключевом слове использования?

С модернизацией модульной системы для издания 2018 года, функционирование use Ключевое слово изменилось. Каковы действительные пути, которые могут идти после use ключевое слово?

2 ответа

Решение

Ваш путь может начинаться двумя разными способами: абсолютным или относительным:

  • Ваш путь может начинаться с имени ящика или crate Ключевое слово для имени текущего ящика:

    struct Foo;
    
    mod module {
        use crate::Foo; // Use `Foo` from the current crate.
        use serde::Serialize; // Use `Serialize` from the serde crate.
    }
    
    fn main() {}
    
  • В противном случае корень неявно self, это означает, что ваш путь будет относительно вашего текущего модуля:

    mod module {
        pub struct Foo;
        pub struct Bar;
    }
    
    use module::Foo; // By default, you are in the `self` (current) module.
    use self::module::Bar; // Explicit `self`.
    

    В этом контексте вы можете использовать super для доступа к внешнему модулю:

    struct Foo;
    
    mod module {
        use super::Foo; // Access `Foo` from the outer module.
    }
    

Пути в use Заявления могут начинаться только следующими способами:

  • имя внешнего ящика: тогда оно относится к этому внешнему ящику
  • crate: относится к (верхнему уровню вашего) собственного ящика
  • self: относится к текущему модулю
  • super: относится к родительскому модулю
  • другое имя: в этом случае оно ищет это имя относительно текущего модуля

Пример, демонстрирующий все виды useдорожки ( детская площадка):

pub const NAME: &str = "peter";
pub const WEIGHT: f32 = 3.1;

mod inner {
    mod child {
        pub const HEIGHT: f32 = 0.3;
        pub const AGE: u32 = 3;
    }

    // Different kinds of uses
    use base64::encode;   // Extern crate `base64`
    use crate::NAME;      // Own crate (top level module)
    use self::child::AGE; // Current module
    use super::WEIGHT;    // Parent module (in this case, this is the same 
                          // as `crate`)
    use child::HEIGHT;    // If the first name is not `crate`, `self` or 
                          // `super` and it's not the name of an extern 
                          // crate, it is a path relative to the current
                          // module (as if it started with `self`)
}

это use поведение оператора изменилось с Rust 2018 (доступно в Rust ≥ 1,31)). Прочтите это руководство для получения дополнительной информации об использовании операторов и как они изменились в Rust 2018.

Другие вопросы по тегам