gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:47:59 30 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 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

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

这是 0.6 版的 Rust 编译器。

最佳答案

您只需要输入 use在文件的顶部:

use thing::asdf::*;

mod thing;

fn main() {}

这看起来很奇怪,但是

  1. 这是错误消息所说的(任何你可以放在顶层的不是 useextern mod 的东西都是一个“项目”,包括 mod s),和
  2. 这就是 Rust 名称解析的工作原理。 use总是相对于 crate 的顶部,并且在名称解析发生之前加载整个 crate,所以 use thing::asdf::*;让 rustc 寻找 thing作为 crate (它找到的)的子模块,然后是 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 .)

关于rust - 如何在 Rust 中编译多文件 crate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340985/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com