“未解决的导入 - 可能是缺少的外部”当存在外部声明时

时间:2015-11-26 23:15:33

标签: rust rust-cargo

我有一个小项目,当它在一个大的.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 个答案:

答案 0 :(得分:17)

引用Crates and Modules chapter of the Rust book

  

[...] use声明是绝对路径,从您的箱子根开始。 self使该路径相对于层次结构中的当前位置。

编译器是正确的;没有rand这样的东西,因为你把它放在一个模块中,所以它的正确路径是GameState::ballstate::randself::rand来自GameState::ballstate模块。

您需要将extern crate rand;移动到根模块使用self::rand模块中的GameState::ballstate

答案 1 :(得分:2)

您需要将extern crate rand;行放在main.rs和/或lib.rs文件中。无需将其放在其他文件中。

也许它与this bug有关。