본문 바로가기

Rust/Basic

[Rust Tutorial] 9 - mod, use

 


 

Intro

필자는 처음 보는 Programming language를 접하게 되면 가장 먼저 찾아보는 것이 있습니다. 변수 선언? 반복문? class? 모두 아닙니다. 저는 source file이 다른 path에 있는 source file을 읽는 방법을 항상 가장 먼저 찾습니다. 왜냐하면 공부한 내용을 적다보면 분리해야 할 때가 있는데 file 단위로 분리하지 않으면 곤란한 경우가 많기 때문입니다. 그리고 이런 속성은 언어별로 많이 다르게 동작합니다.

 

(main file에서 modules/util를 불러온다고 가정합니다)

  • C/C++ : #include "modules/utils.h"header 불러오기
  • Java : util code는 package 선언, import modules.Util로 불러오기
  • Python : from modules.util import util_object으로 util에 속한 객체 불러오기 (저는 이게 가장 편하긴 합니다)
  • JavaScript : 불러올 util object를 export 선언, import { util_object } from './modules/utils.js'

 

Rust는 위의 방법과는 다른 방법으로 불러옵니다. keyword를 통해 알아보겠습니다.

  • mod : 다른 path에 있는 source code를 불러오겠다는 선언 목적으로 사용하는 keyword입니다. 거의 main.rs나 lib.rs에서 사용합니다.
  • use : 다른 source code에 있는 객체를 가져와서 사용할 때 쓰는 keyword입니다. use std:: 로 이미 많이 접해보셨을것으로, use keyword로 본인이 만든 객체도 사용 목적으로 불러올 수 있습니다. project의 첫 path부터 불러오는 경우 crate::로 시작해서 불러올 수 있습니다.
  • pub : 객체(struct, function, const, trait, mod, ...)가 자신의 file 밖에서도 사용될 수 있도록 public을 선언하는 것입니다.

 

code에서는 어떻게 사용되었는지 예시를 보면서 확인해 보겠습니다.

 


 

Code Example

 

Rust 1.79.0 (released 2024-06-13) 

 

[file structure]

src/
├── main.rs
├── app/
│   ├── user.rs
│   └── utils.rs
└── config.rs

 

 

[main.rs]

mod app {               // app folder를 불러옴
    pub mod user;       // app/user.rs file을 불러옴
    pub mod utils;      // app/utils.rs file을 불러옴
}

mod config;             // config.rs를 불러옴

use app::user::{Auth, User};    // app/user.rs에 정의된 Auth, User을 사용(struct, trait, impl)
use app::utils::check_number;   // app/utils.rs에 정의된 check_number function을 사용


fn handle_user_input(user_input_key_number: u32, new_user: &mut User) {
    println!("user input number : {user_input_key_number}");
    if check_number(user_input_key_number) {
        println!("right number input.");
        new_user.set_active();
    } else {
        println!("wrong number input.");
    }
}

fn main() {
    // create user info
    let mut new_user = User::new(String::from("bob"), String::from("bob@gmail.com"));
    println!("{new_user:?}");   // 유저 정보 확인
    println!("--------------------------------");

    // user input wrong number scene
    handle_user_input(10, &mut new_user);  // 잘못된 입력 번호 10
    println!("user is active? : {}", new_user.active);
    println!("--------------------------------");

    // user input right number scene
    handle_user_input(config::KEY_NUMBER, &mut new_user);
    println!("user is active? : {}", new_user.active);
    println!("--------------------------------");
}

 

 

[app/user.rs]

#[derive(Debug)]
#[allow(warnings)]
pub struct User {
    pub name: String,
    pub email: String,
    pub active: bool,
}

pub trait Auth {
    fn set_active(&mut self);
}

impl User {
    pub fn new(name: String, email: String) -> User {
        User {name, email, active: false}
    }
}

impl Auth for User {
    fn set_active(&mut self) {
        self.active = true;
    }
}

 

 

[app/utils.rs]

// config.rs를 사용.
// main에서 mod config가 선언되었기에 사용 가능함
// crate는 project의 root path를 의미함
use crate::config;      

pub fn check_number(input_number:u32) -> bool{
    input_number == config::KEY_NUMBER
}

 

 

[config.rs]

pub const KEY_NUMBER: u32 = 123;

 

 

 


 

* reference

 - https://doc.rust-lang.org/book/

'Rust > Basic' 카테고리의 다른 글

[Rust Tutorial] 11 - Option  (0) 2024.11.25
[Rust Tutorial] 10 - Generic  (0) 2024.11.25
[Rust Tutorial] 8 - Struct, Impl, Trait  (0) 2024.11.18
[Rust Tutorial] 7 - Ownership  (0) 2024.11.17
[Rust Tutorial] 6 - Control Flow  (0) 2024.11.17