rust rust-cargo

rust - "Importación no resuelta, tal vez una falta externa" Cuando existe una declaración externa



rust install dependencies (2)

Tengo un pequeño proyecto que se desarrolló sin problemas cuando todo estaba en un gran archivo .rs. Quería que fuera más fácil trabajar con él, así que lo dividí en módulos, y el proyecto ahora está estructurado así:

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

En ballstate.rs , necesito usar la caja rand . Aquí hay una versión abreviada del archivo:

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

Sin embargo, cuando ejecuto cargo build desde el directorio de nivel superior, aparece el siguiente error:

GameState / ballstate.rs: 42: 9: 42:13 error: importación resuelta rand::* . Tal vez un extern crate rand faltante?

Cuando acabo de tener la declaración de la caja externa en mi archivo main.rs, funcionó. ¿Qué ha cambiado ahora que está en un módulo separado?


Necesitas poner el extern crate rand; línea en su main.rs y / o lib.rs No es necesario ponerlo en los otros archivos.

Quizás esté relacionado con este error .


Para citar del capítulo Cajas y Módulos del libro de Rust :

[...] las declaraciones de use son rutas absolutas, comenzando desde la raíz de su caja. self hace ese camino relativo a su lugar actual en la jerarquía en su lugar.

El compilador es correcto; no hay nada como rand , porque lo has puesto dentro de un módulo, por lo que la ruta correcta sería GameState::ballstate::rand , o self::rand desde el módulo GameState::ballstate .

Necesitas mover el extern crate rand; al módulo raíz o use self::rand dentro del módulo GameState::ballstate .