2015-11-26 18 views
7

Ho un piccolo progetto che è stato creato senza problemi quando era tutto in un unico grande file .rs. Ho voluto rendere più facile lavorare con, così ho rotto in su in moduli, e il progetto è ora strutturato in questo modo:"importazione non risolta - forse un extern mancante" Quando esiste la dichiarazione extern

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

In ballstate.rs, ho bisogno di usare il rand cassa. Ecco una versione abbreviata del file:

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

Tuttavia, quando corro cargo build dalla directory di livello superiore, ottengo il seguente errore:

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

Quando ho appena avuto la dichiarazione di cassa extern nel mio file main.rs, questo ha funzionato. Cosa è cambiato ora che è in un modulo separato?

risposta

11

Per citare dal Crates and Modules chapter of the Rust book:

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

Il compilatore è corretta; non esiste una cosa come rand, perché l'hai inserita in un modulo, quindi il percorso corretto sarebbe GameState::ballstate::rand o self::rand dal modulo GameState::ballstate.

è necessario o spostare extern crate rand; al modulo radice o uso self::rand all'interno del modulo GameState::ballstate.

+0

Questa è la risposta che ho ricevuto poche ore fa; grazie per aver postato (e per aver indicato dove è stato detto in quel libro/tutorial, in realtà l'ho letto prima di postare la domanda e non ho capito che aveva la soluzione per tutto il tempo). Non volevo insinuare che il compilatore avesse torto, solo che non capivo esattamente cosa fosse cambiato dallo scenario di un file ai molti. –

2

È necessario inserire la riga extern crate rand; nel file main.rs e/o lib.rs. Non c'è bisogno di metterlo negli altri file.

Forse è correlato a this bug.