2013-06-27 20 views
5

我想弄清楚如何在Rust中编译多文件板条箱,但我不断收到编译错误。如何在Rust中编译多文件箱?

我有一个文件我想导入到箱子thing.rs:

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

我的箱子文件test.rc:

mod thing; 

use thing::asdf::*; 

fn main(){ 

} 

当我运行锈生成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 

显然有一些简单的关于如何模块,板条箱和使用工作,我只是没有得到。我的理解是那个mod有些东西;对于同一目录中的文件或extern mod某些内容;库路径上的库导致目标文件被链接。然后使用将允许您导入模块的一部分到当前文件,功能或模块。这似乎适用于核心库中的东西。

这是0.6版本的锈编译器。

回答

8

你只需把use在文件的顶部:

use thing::asdf::*; 

mod thing; 

fn main() {} 

这看起来很奇怪,但

  1. 这是什么错误消息说(什么,你可以把在顶级不是useextern mod是一个“项目”,包括mod s)和
  2. 这就是Rust名称解析的工作原理。 use总是相对于箱子的顶部,并且整个箱子在名称解析发生之前加载,因此use thing::asdf::*;使rustc找到thing作为箱子的子模块(它找到),然后asdf作为子模块,等

为了说明这最后一点更好(并证明usesuperself两个特殊的名字,它直接从父和当前模块分别导入):

// 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。)