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


130

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

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

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



답변:


239

당신은 필요하지 않습니다 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!");
}

1
늦은 질문은 mod hello 대신 hello를 사용하여 지정하면 작동하지 않습니까?!
Christian Schmitt

16
@ChristianSchmitt 아니, 그들은 다른 것들입니다. 파일 usemod가져 오는 동안 네임 스페이스 일뿐 입니다. use예를 들어를 사용 print_hello하면 네임 스페이스를 접두사로 사용하지 않고도 함수 를 호출 할 수 있습니다.
Renato Zannon

25

중첩 된 모듈을 원할 경우 ...

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

4
inaccessible.rsin nested.rs... 에서 무언가를 사용하고 싶다고 가정합니다 . 어떻게해야합니까?
Heman Gandhi

main.rs가 아닌 파일에서 형제 .rs 파일에 액세스하려면 path 속성을 사용하십시오. 따라서 nested.rs의 맨 위에 다음을 추가하고 다음 #[path = "inaccessible.rs"]줄에 추가하십시오 .mod inaccessible;
Gardener

참조 @Gandhi 경로 속성
정원사

2
@HemanGandhi를 추가 mod inaccessible;하여 my/mod.rs하위 모듈로 my만든 다음 nested.rs상대 경로로 형제 모듈에 액세스 합니다 super::inaccessible::function(). path여기에 속성 이 필요하지 않습니다 .
artin

9

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

이 '트릭'을 사용 fn하여 파일과 동일한 이름으로 다시 내 #[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;
보내야

이것은 받아 들여진 대답이어야합니다 imo
Homam Bahrani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.