我有一个小项目,当它在一个大的.rs文件中时没有任何问题。我想让它更容易使用,所以我将其分解为模块,现在项目的结构如下:
├── GameState
│ ├── ballstate.rs
│ ├── collidable.rs
│ ├── gamestate.rs
│ ├── mod.rs
│ └── playerstate.rs
├── lib.rs
└── main.rs
在ballstate.rs
中,我需要使用rand
包。这是文件的缩写版本:
extern crate rand;
pub struct BallState {
dir: Point,
frame: BoundingBox
}
impl BallState {
fn update_dir(&mut self) {
use rand::*;
let mut rng = rand::thread_rng();
self.dir.x = if rng.gen() { Direction::Forwards.as_float() } else { Direction::Backwards.as_float() };
self.dir.y = if rng.gen() { Direction::Forwards.as_float() } else { Direction::Backwards.as_float() };
}
}
但是,当我从顶级目录运行cargo build
时,出现以下错误:
GameState / ballstate.rs:42:9:42:13错误:未解决的导入
rand::*
。也许缺少extern crate rand
?
当我在main.rs文件中输入extern crate声明时,这很有效。现在有什么变化,它在一个单独的模块中?
答案 0 :(得分:17)
引用Crates and Modules chapter of the Rust book:
[...]
use
声明是绝对路径,从您的箱子根开始。self
使该路径相对于层次结构中的当前位置。
编译器是正确的;没有rand
这样的东西,因为你把它放在一个模块中,所以它的正确路径是GameState::ballstate::rand
或self::rand
来自GameState::ballstate
模块。
您需要将extern crate rand;
移动到根模块或使用self::rand
模块中的GameState::ballstate
。
答案 1 :(得分:2)
您需要将extern crate rand;
行放在main.rs
和/或lib.rs
文件中。无需将其放在其他文件中。
也许它与this bug有关。