すべてが1つの大きな.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ファイルにexterncrate宣言があったとき、これは機能しました。別のモジュールに含まれるようになった今、何が変更されましたか?
Rust本 のクレートとモジュールの章から引用するには:
[...]
use
宣言は、クレートルートから始まる絶対パスです。self
は、代わりに階層内の現在の場所を基準にしてそのパスを作成します。
コンパイラは正しいです。 Rand
のようなものはありません。モジュール内に配置しているため、正しいパスはGameState::ballstate::Rand
、またはself::Rand
モジュール内からのGameState::ballstate
になります。
extern crate Rand;
をルートモジュールに移動するか、self::Rand
モジュール内でGameState::ballstate
を使用する必要があります。
extern crate Rand;
またはmain.rs
ファイルにlib.rs
行を挿入する必要があります。他のファイルに入れる必要はありません。
おそらくそれは このバグ に関連しています。