traduccion ps4 lenguaje language juego module rust

module - ps4 - ¿Cómo hago una importación/inclusión básica de una función de un módulo a otro en Rust 2015?



rust traduccion (2)

En Rust, hay algunas palabras clave para tratar con módulos:

extern crate

extern crate llena el espacio entre Cargo y Rust. Escribimos código en un archivo .rs, este archivo se puede compilar con rustc . Cargo gestionará las dependencias externas y llamará a rustc . La línea de extern crate ... le dice al compilador que busque este espacio de nombres, por lo que no es ambiguo.

Nota del editor: la extern crate no es necesaria en muchos casos si está utilizando la edición Rust 2018.

mod

mod tiene dos usos:

  • cuando se usa con llaves, declara un módulo (espacio de nombres).
  • cuando se usa solo con un nombre, buscará el módulo en el sistema de archivos local.

Los módulos pueden ser:

  • archivos con extensión .rs
  • carpetas con un archivo llamado mod.rs

use

use importa un espacio de nombres. Estamos obligados a anunciar qué vamos a usar antes de usarlo. La cláusula de uso es bastante estricta, si use module1::moduleA; Ningún otro módulo del module1 estará disponible excepto el moduleA Se puede usar un asterisco ( * ) para usar todo dentro de un módulo: use module1::*; . Los conjuntos también se pueden usar: use module1::{moduleA, moduleB};

Un ejemplo:

| main.rs |- module1 |- mod.rs |- moduleA.rs |- moduleB.rs

mod.rs contiene:

pub mod moduleA; // declare a child module pub mod moduleB; // declare a child module

main.rs contiene:

/// ====== // use what Cargo downloaded extern crate that_one_thing_i_need; /// ====== mod module1; // declare a child module // some local stuff I want to scope mod local { pub fn my_function() {} } // ====== // make the symbols locally available: use module1::moduleA::*; use module1::moduleB::{functionX, moduleY, typeZ}; // we still need to announce what stuff from the external crate // we want to use: // We can do local aliases that will be valid in this one file. use that_one_thing_i_need::fancy_stuff as fs; /// ====== fn main() { // we can use anything here from the namespaces we are using: // moduleA // functionX // moduleY // typeZ // fs // We can access stuff by navigating from the outermost visible // module name local::my_function(); }

Los símbolos solo se pueden usar desde el módulo. Si desea cruzar esta barrera (incluso en un módulo declarado localmente), debemos hacerlos públicos utilizando la palabra clave pub .

No puedo encontrar cómo incluir (o importar, inyectar o alguna otra palabra) una función de un archivo (módulo) a otro.

Comienzo un nuevo proyecto con

$ cd ~/projects $ cargo new proj --bin $ cd proj $ tree . | -- Cargo.toml -- src | -- main.rs

main.rs y creo un nuevo archivo a.rs (dentro del directorio src ) con el siguiente código:

main.rs

fn main() { println!("{}", a::foo()); }

a.rs

pub fn foo() -> i32 { 42 }

Ejecuto el proyecto con cargo run y obtengo el error:

error[E0433]: failed to resolve: use of undeclared type or module `a` --> src/main.rs:2:20 | 2 | println!("{}", a::foo()); | ^ use of undeclared type or module `a`

Parece que necesito importar el a alguna manera. Intenté agregar las siguientes cosas como primera línea a main.rs

  • use a;

    error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a; | ^ no `a` in the root

  • use a::*;

    error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a::*; | ^ maybe a missing `extern crate a;`? error[E0433]: failed to resolve: use of undeclared type or module `a` --> src/main.rs:4:20 | 4 | println!("{}", a::foo()); | ^ use of undeclared type or module `a`

  • use a::foo;

    error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a::foo; | ^ maybe a missing `extern crate a;`? error[E0433]: failed to resolve: use of undeclared type or module `a` --> src/main.rs:4:20 | 4 | println!("{}", a::foo()); | ^ use of undeclared type or module `a`

  • extern crate a; use a::foo;

    error[E0463]: can''t find crate for `a` --> src/main.rs:1:1 | 1 | extern crate a; | ^^^^^^^^^^^^^^^ can''t find crate

  • extern crate proj; use proj::a::foo;

    error[E0463]: can''t find crate for `proj` --> src/main.rs:1:1 | 1 | extern crate proj; | ^^^^^^^^^^^^^^^^^^ can''t find crate

He leído la guía pero todavía no puedo entender cómo hacer importaciones.


En un módulo principal (main.rs, lib.rs o subdir / mod.rs), debe escribir mod a; para todos los demás módulos que desea utilizar en todo su proyecto (o en el subdirectorio).

En cualquier otro módulo, necesita escribir use a; o use a::foo;

Estás lejos de ser la única persona confundida por esto, y ciertamente es posible hacerlo mejor, pero cualquier cambio en el sistema del módulo será rechazado por ser "demasiado confuso".

Editar: esta respuesta fue escrita para el lenguaje estándar "Rust 2015". Se hicieron cambios para el estándar "Rust 2018", vea esta publicación de blog y la guía de edición