2015-11-26 5 views
7

大きな.rsファイルにすべて含まれていても問題なしで構築された小さなプロジェクトがあります。私はそれが簡単で動作するようにしたかったので、私は、モジュールにそれを解散し、プロジェクトは次のように構成されています"未解決のインポート - たぶん不足しているextern" extern宣言が存在する場合

├── GameState 
│   ├── ballstate.rs 
│   ├── collidable.rs 
│   ├── gamestate.rs 
│   ├── mod.rs 
│   └── playerstate.rs 
├── lib.rs 
└── main.rs 

ballstate.rsでは、私はrandクレートを使用する必要があります。ここでは、ファイルの簡略版です:私は、トップレベルのディレクトリからcargo buildを実行したときに

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() }; 
    }                           
} 

は、しかし、私は次のエラーを取得する:私はちょうど内でexternクレート宣言を持っていた

GameState/ballstate.rs:42:9: 42:13 error: unresolved import rand::* . Maybe a missing extern crate rand ?

私main.rsファイル、これはうまくいきました。別のモジュールになった今、変更されたのは何ですか?

答えて

11

[...] use declarations are absolute paths, starting from your crate root. self makes that path relative to your current place in the hierarchy instead.

コンパイラが正しいです。 randのようなものはありません。モジュールに入れているからです。そのため、正しいパスはGameState::ballstate::rand、またはモジュールのself::randになります。

あなたはGameState::ballstateモジュール内のルートモジュールまたは使用self::randextern crate rand;を移動するためのいずれかが必要です。

+0

これは数時間前に私が到着した答えです。 (そして、この本/チュートリアルのどこにこれが書かれているかを指摘するために、私は質問を投稿する前に実際にそれを読んで、いつも解決策があることに気付かなかった)。私は、コンパイラが間違っていたことを意味するわけではなく、ちょうど1つのファイルシナリオから多くのシナリオに変更されたことを正確に理解できませんでした。 –

関連する問題