[rust] 동일한 프로젝트의 다른 파일에서 모듈을 포함하는 방법은 무엇입니까?

다음으로 이 가이드를 나는화물 프로젝트를 만들었습니다.

src/main.rs

fn main() {
    hello::print_hello();
}

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

내가 사용하는

cargo build && cargo run

오류없이 컴파일됩니다. 이제 기본 모듈을 두 개로 분할하려고하지만 다른 파일의 모듈을 포함하는 방법을 알 수 없습니다.

내 프로젝트 트리는 다음과 같습니다.

├── src
    ├── hello.rs
    └── main.rs

및 파일의 내용 :

src/main.rs

use hello;

fn main() {
    hello::print_hello();
}

src/hello.rs

mod hello {
    pub fn print_hello() {
        println!("Hello, world!");
    }
}

내가 그것을 컴파일 cargo build하면

error[E0432]: unresolved import `hello`
 --> src/main.rs:1:5
  |
1 | use hello;
  |     ^^^^^ no `hello` external crate

나는 컴파일러의 제안을 따르고 다음과 같이 수정 main.rs했습니다.

#![feature(globs)]

extern crate hello;

use hello::*;

fn main() {
    hello::print_hello();
}

그러나 이것은 여전히별로 도움이되지 않습니다.

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

현재 프로젝트의 모듈 하나를 프로젝트의 기본 파일에 포함시키는 방법에 대한 간단한 예가 있습니까?



답변

당신은 필요하지 않습니다 mod hello당신의 hello.rs파일. 모든 파일의 코드 ( main.rs실행 파일 용, lib.rs라이브러리 용)는 자동으로 모듈에 네임 스페이스가 지정됩니다.

의 코드 포함하려면 hello.rs당신의 main.rs사용을 mod hello;. hello.rs이전에했던 것과 똑같이 안에있는 코드로 확장됩니다 . 파일 구조는 동일하게 유지되며 코드를 약간 변경해야합니다.

main.rs:

mod hello;

fn main() {
    hello::print_hello();
}

hello.rs:

pub fn print_hello() {
    println!("Hello, world!");
}


답변

중첩 된 모듈을 원할 경우 …

Rust 2018

있어 더 이상 필요하지 않습니다 파일을 가지고 mod.rs(여전히 지원되지만). 관용적 대안은 파일 이름을 모듈 이름으로 지정하는 것입니다.

$ tree src
src
├── main.rs
├── my
│   ├── inaccessible.rs
│   └── nested.rs
└── my.rs

main.rs

mod my;

fn main() {
    my::function();
}

my.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}

Rust 2015

mod.rs모듈과 같은 이름의 파일을 폴더에 넣어야 합니다. Rust by Example 이 더 잘 설명합니다.

$ tree src
src
├── main.rs
└── my
    ├── inaccessible.rs
    ├── mod.rs
    └── nested.rs

main.rs

mod my;

fn main() {
    my::function();
}

mod.rs

pub mod nested; // if you need to include other modules

pub fn function() {
    println!("called `my::function()`");
}


답변

나는 Gardener의 반응을 정말 좋아합니다. 내 모듈 선언에 대한 제안을 사용하고 있습니다. 기술적 인 문제가 있으면 누군가 차임 해주세요.

./src
├── main.rs
├── other_utils
│   └── other_thing.rs
└── utils
    └── thing.rs

main.rs

#[path = "utils/thing.rs"] mod thing;
#[path = "other_utils/other_thing.rs"] mod other_thing;

fn main() {
  thing::foo();
  other_thing::bar();
}

utils / thing.rs

pub fn foo() {
  println!("foo");
}

other_utils / other_thing.rs

#[path = "../utils/thing.rs"] mod thing;

pub fn bar() {
  println!("bar");
  thing::foo();
}


답변