未解决的导入 —— 可能是缺少外部声明

18

我有一个小项目,当所有代码都在一个大的.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声明时,它可以工作。现在它在一个单独的模块中有何变化?

2个回答

20

引用自 Rust 书籍的 Crates and Modules chapter 章节:

[...] use 声明是绝对路径,从你的 crate 根目录开始。而 self 则可以使得路径相对于你当前所在的层次。

编译器是正确的;因为你已经把 rand 放到了一个模块里,所以它并不存在,因此正确的路径应该是 GameState::ballstate::rand,或者从 GameState::ballstate 模块中使用 self::rand

你需要将 extern crate rand; 转移到根模块,或者GameState::ballstate 模块中使用 self::rand


这是我几个小时前得出的答案;感谢您的发布(以及指出在那本书/教程中提到了什么,我在发布问题之前实际上已经阅读过它,但没有意识到它一直有解决方案)。我并不是想暗示编译器错了,只是我不太明白从一个文件情况到多个文件情况发生了什么变化。 - Ben Pious

2
你需要在你的main.rs和/或lib.rs文件中添加extern crate rand;行。不需要在其他文件中添加。
也许这与这个bug有关。

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