如何在Rust中编译多文件的crate?

6

我正在尝试弄清楚如何在Rust中编译多文件crate,但是我一直收到编译错误。

我有一个想要导入到crate的文件thing.rs:

mod asdf {
    pub enum stuff {
        One,
        Two,
        Three
    }
}

我的货箱文件test.rc:

mod thing;

use thing::asdf::*;

fn main(){

} 

当我运行rust build test.rc时,我会得到以下结果:
test.rc:3:0: 3:19 error: `use` and `extern mod` declarations must precede items
test.rc:3 use thing::asdf::*;
          ^~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

很明显,模块、箱子和use的工作原理很简单,但我仍然不能理解。我的理解是,在相同目录下使用mod something; 或在库路径上使用extern mod something; 会导致链接对象文件。然后,使用use可以将模块的部分导入当前文件、函数或模块中。这对核心库中的内容似乎是有效的。

这是使用Rust编译器版本0.6时的情况。

1个回答

9
你只需要在文件的顶部加上use即可:
use thing::asdf::*;

mod thing;

fn main() {}

这看起来非常奇怪,但是:
1.这就是错误消息所说的(除了“use”或“extern mod”,任何你可以放在顶层的东西都是“项”,包括mod),并且
2.Rust名称解析的工作方式就是这样。use始终相对于创建的顶部,整个创建在名称解析发生之前加载,因此use thing::asdf::*;使rustc查找thing作为创建的子模块(它找到了),然后查找asdf作为那个子模块的子模块等。
为了更好地说明这一点(并演示use中的两个特殊名称super和self,它们分别直接从父模块和当前模块导入):
// crate.rs

pub mod foo {
    // use bar::baz; // (an error, there is no bar at the top level)

    use foo::bar::baz; // (fine)
    // use self::bar::baz; // (also fine)

    pub mod bar {
        use super::qux; // equivalent to
        // use foo::qux; 

        pub mod baz {}
    }
    pub mod qux {}
}

fn main() {}

另外,顺带一提,.rc 文件扩展名已经不再对任何 Rust 工具(包括 0.6 版本)具有特殊意义,并已被弃用,例如编译器源代码中的所有 .rc 文件最近都已重命名为 .rs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接