3

随着 2018 年版模块系统的改进,use关键字的功能发生了变化。可以在use关键字之后使用的有效路径是什么?

4

2 回答 2

4

语句中的路径use只能以以下方式开始:

  • extern crate 的名称:那么它指的是那个 extern crate
  • crate: 指的是(你的顶层)自己的 crate
  • self: 指当前模块
  • super: 指父模块
  • 其他名称:在这种情况下,它会查找对于当前模块的名称

演示各种use-paths ( Playground ) 的示例:

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 中可用))。阅读本指南,了解有关 use 语句以及它们在 Rust 2018 中的变化的更多信息。

于 2019-02-07T16:28:43.070 回答
2

您的路径可以以两种不同的方式开始:绝对或相对:

  • crate您的路径可以以 crate 名称或命名当前 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() {}
    
  • 否则,根是implicitely 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.
    }
    
于 2019-01-21T11:31:32.583 回答