수색…


통사론

  • mod modname ; // 동일한 디렉터리에있는 modname .rs 또는 modname /mod.rs에서 모듈을 검색합니다.
  • mod modname { 블록 }

모듈 트리

파일 :

- example.rs (root of our modules tree, generally named lib.rs or main.rs when using Cargo)
- first.rs
- second/
  - mod.rs
  - sub.rs

모듈 :

- example        -> example
  - first        -> example::first
  - second       -> example::second
    - sub        -> example::second::sub
  - third        -> example::third

example.rs

pub mod first;
pub mod second;
pub mod third {
    ...
}

이 모듈은 second 선언해야 example.rs 상위는 파일로서 example , 그리고, 예를 들면 first 따라서 선언 할 수 first.rs 또는 같은 디렉토리 레벨에서 다른 파일

second/mod.rs

pub mod sub;

# [경로] 속성

Rust의 #[path] 속성은 표준 위치에 있지 않은 특정 모듈을 검색 할 경로를 지정하는 데 사용할 수 있습니다. 그러나 일반적으로 모듈 계층 구조가 취약 해지고 완전히 다른 디렉토리에서 파일을 이동하여 쉽게 빌드를 중단 할 수 있기 때문에 일반적으로 사용하지 않는 것이 좋습니다 .

#[path="../path/to/module.rs"]
mod module;

코드의 이름과 '사용'의 이름

use 문에있는 이름의 이중 콜론 구문은 코드의 다른 곳에서 사용 된 이름과 유사하지만 이러한 경로의 의미는 다릅니다.

기본적으로 use 문에있는 이름은 crate root에서 시작하여 절대적인 것으로 해석됩니다. 코드의 다른 곳의 이름은 현재 모듈과 관련이 있습니다.

진술 :

use std::fs::File;

모듈뿐만 아니라 크레이트의 주 파일에서도 동일한 의미를가집니다. 반면에 std::fs::File::open() 과 같은 함수 이름은 코드의 이름이 현재 모듈을 기준으로 해석되기 때문에 상자의 기본 파일에서만 Rust의 표준 라이브러리를 참조합니다.

fn main() {
    std::fs::File::open("example"); // OK
}

mod my_module {
   fn my_fn() {
       // Error! It means my_module::std::fs::File::open()
       std::fs::File::open("example"); 

       // OK. `::` prefix makes it absolute 
       ::std::fs::File::open("example"); 

       // OK. `super::` reaches out to the parent module, where `std` is present
       super::std::fs::File::open("example"); 
   } 
}

std::… names를 추가 할 수있는 상자의 루트와 같은 모든 곳에서 행동하게하려면 :

use std;

반대로 self 키워드 나 super 키워드를 접두어로 사용하여 상대 경로를 use 수 있습니다.

 use self::my_module::my_fn;

상위 모듈 액세스

때로는 프로젝트에서 절대 경로와 함께 무언가를 use 하지 않고도 함수와 구조체를 상대적으로 가져 오는 것이 유용 할 수 있습니다. 이를 위해 다음과 같이 super 모듈을 사용할 수 있습니다.

fn x() -> u8 {
    5
}

mod example {
    use super::x;

    fn foo() {
        println!("{}", x());
    }
}

super 여러 번 사용하여 현재 모듈의 '조부모'에게 접근 할 수 있지만 한 번 가져 오기에서 super 너무 많이 사용하면 가독성 문제가 발생하는 것을 조심해야합니다.

수출 및 가시성

디렉토리 구조 :

yourproject/
    Cargo.lock
    Cargo.toml
    src/
        main.rs
        writer.rs

main.rs

// This is import from writer.rs
mod writer;

fn main() {
    // Call of imported write() function.
    writer::write()
    
    // BAD
    writer::open_file()
}

작가 .rs

// This function WILL be exported.
pub fn write() {}

// This will NOT be exported.
fn open_file() {}

기본 코드 구성

코드베이스가 커지면 어떻게 코드를 구성 할 수 있는지 보도록하겠습니다.

01. 기능들

fn main() {
  greet();
}

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

02. 모듈 - 동일한 파일에 있음

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

mod greet {
  // By default, everything inside a module is private
  pub fn hello() { // So function has to be public to access from outside
    println!("Hello, world!");
  }
}

03. 모듈 - 같은 디렉토리에있는 다른 파일에 있음

일부 코드를 새 파일로 옮길 때 mod 선언에 코드를 래핑 할 필요가 없습니다. 파일 자체는 모듈로 작동합니다.

// ↳ main.rs
mod greet; // import greet module

fn main() {
  greet::hello();
}
// ↳ greet.rs
pub fn hello() { // function has to be public to access from outside
  println!("Hello, world!");
}

일부 코드를 새 파일로 옮길 때 해당 코드가 mod 선언에서 래핑 된 경우 해당 파일의 하위 모듈이됩니다.

// ↳ main.rs
mod greet;

fn main() {
  greet::hello::greet();
}
// ↳ greet.rs
pub mod hello { // module has to be public to access from outside
  pub fn greet() { // function has to be public to access from outside
    println!("Hello, world!");
  }
}

04. 모듈 - 다른 디렉토리에있는 다른 파일에 있음

일부 코드를 다른 디렉토리의 새 파일로 이동하면 디렉토리 자체가 모듈로 작동합니다. 모듈 루트의 mod.rs 는 디렉토리 모듈의 시작점입니다. 해당 디렉토리의 다른 모든 파일은 해당 디렉토리의 하위 모듈로 작동합니다.

// ↳ main.rs
mod greet;

fn main() {
  greet::hello();
}
// ↳ greet/mod.rs
pub fn hello() {
  println!("Hello, world!");
}

모듈 루트에 여러 개의 파일이있을 때,

// ↳ main.rs
mod greet;

fn main() {
  greet::hello_greet()
}
// ↳ greet/mod.rs
mod hello;

pub fn hello_greet() {
  hello::greet()
}
// ↳ greet/hello.rs
pub fn greet() {
  println!("Hello, world!");
}

05. 모듈 - self 와 함께

fn main() {
  greet::call_hello();
}

mod greet {
  pub fn call_hello() { 
    self::hello();
  }

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

06. 모듈 - super

  1. 모듈 내부에서 루트 함수에 액세스하려면,
fn main() {
  dash::call_hello();
}

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

mod dash {
  pub fn call_hello() {
    super::hello();
  }
}
  1. 중첩 모듈 내부에서 외부 / 부모 모듈의 함수에 액세스하려면,
fn main() {
  outer::inner::call_hello();
}

mod outer {

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

  mod inner {
    pub fn call_hello() {
      super::hello();
    }
  }

}

07. 모듈 - use

  1. 전체 경로를 새 이름으로 바인딩하려는 경우,
use greet::hello::greet as greet_hello;

fn main() {
  greet_hello();
}

mod greet {
  pub mod hello {
    pub fn greet() {
      println!("Hello, world!");
    }
  }
}
  1. 크레이트 범위 수준 콘텐츠를 사용하려는 경우
fn main() {
  user::hello();
}

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

mod user {
  use greet::hello::greet as call_hello;

  pub fn hello() {
    call_hello();
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow