Каковы действительные корни пути в ключевом слове использования? - PullRequest
0 голосов
/ 21 января 2019

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Пути в операторах 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.

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

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

  • Ваш путь может начинаться с имени ящика или ключевого слова 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.
    }
    
...