Seguindo este guia , criei um projeto Cargo.
src/main.rs
fn main() {
hello::print_hello();
}
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
que corro usando
cargo build && cargo run
e compila sem erros. Agora estou tentando dividir o módulo principal em dois, mas não consigo descobrir como incluir um módulo de outro arquivo.
Minha árvore de projeto se parece com isto
├── src
├── hello.rs
└── main.rs
e o conteúdo dos arquivos:
src/main.rs
use hello;
fn main() {
hello::print_hello();
}
src/hello.rs
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
Quando eu compilo com cargo build
eu obtenho
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Tentei seguir as sugestões do compilador e modifiquei main.rs
para:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Mas isso ainda não ajuda muito, agora eu entendo:
error[E0463]: can't find crate for `hello`
--> src/main.rs:3:1
|
3 | extern crate hello;
| ^^^^^^^^^^^^^^^^^^^ can't find crate
Existe um exemplo trivial de como incluir um módulo do projeto atual no arquivo principal do projeto?
Respostas:
Você não precisa do
mod hello
em seuhello.rs
arquivo. O código em qualquer arquivo, exceto a raiz da caixa (main.rs
para executáveis,lib.rs
para bibliotecas), recebe um namespace automaticamente em um módulo.Para incluir o código de
hello.rs
em seumain.rs
, usemod hello;
. Ele é expandido para o código que estáhello.rs
(exatamente como você fazia antes). Sua estrutura de arquivo continua a mesma e seu código precisa ser ligeiramente alterado:main.rs
:hello.rs
:fonte
use
é apenas uma coisa de namespace, enquantomod
puxa o arquivo. Você usariause
, por exemplo, para poder chamar aprint_hello
função sem ter que prefixar com o namespaceSe você deseja ter módulos aninhados ...
Ferrugem 2018
Não é mais necessário ter o arquivo
mod.rs
(embora ainda seja compatível). A alternativa idiomática é nomear o arquivo com o nome do módulo:main.rs
my.rs
Rust 2015
Você precisa colocar um
mod.rs
arquivo dentro de sua pasta com o mesmo nome de seu módulo. Rust by Example explica melhor.main.rs
mod.rs
fonte
inaccessible.rs
emnested.rs
... como eu faria isso?#[path = "inaccessible.rs"]
e na próxima linha:mod inaccessible;
mod inaccessible;
amy/mod.rs
para torná-lo submódulo de emy
, a seguir, acesse o módulo irmãonested.rs
pelo caminho relativosuper::inaccessible::function()
. você não precisa depath
atributo aqui.Eu realmente gosto da resposta de Gardener. Tenho usado a sugestão para minhas declarações de módulo. Alguém, por favor, entre em contato se houver um problema técnico com isso.
main.rs
utils / thing.rs
other_utils / other_thing.rs
fonte
fn
com o mesmo nome do arquivo em que estava.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;