본문 바로가기

Rust

러스트 모듈(pub mod)

pub모듈을 사용하여 api기능을 구축하고 있는 사진, 출처 유데미(https://www.udemy.com/course/front-end-web-development-in-rust/)

 

러스트 yew라이브러리를 사용하여 spa 홈페이지를 구축할 수 있다 이때도 라우터 페이지들을 pub모듈별로 분리하여 사용하였다. 출처 유데미(https://www.udemy.com/course/front-end-web-development-in-rust/)

 
 
웹애플리케이션을 만들 때 보면 외부 공개 모듈 pub(public이라는뜻)을 사용하여  프로그램을 기능별로 분리한다 
 
모듈은(mod)는 스코프 범위 단위, 모듈의 관계는 트리 구조로 표현할 수 있다. mod 안에 pub mod라는 서브모듈이 있고 use를 사용해  서브 모듈을 꺼내서 사용할 수 있다. pub는 해당 모듈을 외부로 노출시킨다는 의미이다. 
 
 

mod random {
   // linear 모듈 선언 
    pub mod linear {
        use std::num::Wrapping;
      // 선형합동법으로 난수 생성 
        pub fn rand(seed: &mut u32) -> u32 {
            let (a, c) = (1u32, 2u32);
      // Wrapping을 사용하여 연산 오버플로우를 무시한다.
            *seed = (Wrapping(*seed) * Wrapping(a) + Wrapping(c)).0;
            *seed
        }
    }

  // xorshift  모듈 선언 
    pub mod xorshift {
      // xorshift로 난수 생성 
        pub fn rand(seed: &mut u32) -> u32 {
            let mut y = *seed;
            y ^= y << 13; // 비트가 왼쪽으로 2의배수 
            y ^= y >> 17; // 비트가 오른쪽으로가면 2를 나눠준다 
            y ^= y << 5;
            *seed = y;
            y
        }
    }
}

// use를 사용하여 pub로 공개한 모듈을 이용한다
use random::{linear, xorshift};

fn main() {
    let mut seed1 = 1u32;
    let mut seed2 = 2u32;
  // 10개의 난수를 생성 이때 숫자 1부터 6안의 범위에서 난수를 만든다 
    for i in 0..10 {
        let r1 = linear::rand(&mut seed1) % 6 + 1;
        let r2 = xorshift::rand(&mut seed2) % 6 + 1;
        println!("L : {:2} 번째 = {}, {}", i + 1, r1, r2);
    }
}

 
 
타입u32에 1u32, 2u32라는 정수리터럴에 타입 접미사가 붙여져있다. 이때 타입 접미사가 생략되어 있으면 러스트는 타입을 못박아줄 결정적인 단서가 되는 값을 찾을 때 까지 결정을 미룬다.

타입 접미사를 생략하니 not a value라고 값을 넣으라고 친절하게 에러를 표시해준다.

 
 
그리고 모듈을 파일별로 분리시킬 수 있다.

 

// radom모듈에 linear, xorshift 모듈을 선언한다.
pub mod linear;
pub mod xorshift;

src/random/mod.rs
 

use std::num::Wrapping;

pub fn rand(seed: &mut u32) -> u32 {
    let (a, c) = (134775813u32, 12345u32);
    *seed = (Wrapping(*seed) * Wrapping(a) + Wrapping(c)).0;
    *seed
}

src/random/linear.rs
 

pub fn rand(seed: &mut u32) -> u32 {
    let mut y = *seed;
    y ^= y << 13;
    y ^= y >> 17;
    y ^= y << 5;
    *seed = y;
    y
}

src/random/xorshift.rs
 

mod random;

// 크레이트(crate)는 트리 구조로 표현되는 모듈군 전체를 의미
use crate::random::{linear, xorshift};
fn main() {
    let mut seed = 1u32;
    let r1 = linear::rand(&mut seed);
    let r2 = xorshift::rand(&mut seed);
    println!("{}, {}", r1, r2);
}

src/random/main.rs
 
 
책을 읽고 공부한 것을 정리한 내용입니다.. 
https://www.yes24.com/Product/Goods/116586619

 

만들면서 배우는 러스트 프로그래밍 - 예스24

고효율, 현대적 프로그래밍 언어 Rust의 결정적 해설서!러스트는 효율적이고 신뢰할 수 있으며 생산성이 높은 언어로, 프로그래머가 가장 배우고 싶어 하는 언어로 꼽힌다. 배울 가치가 높은 언

www.yes24.com

 
https://www.yes24.com/Product/Goods/116789691

 

프로그래밍 러스트 - 예스24

『러스트 프로그래밍 공식 가이드』보다 더 친절하게, 한층 더 고급 기능까지 다룬다!이 책은 메모리 안전성과 신뢰할 만한 동시성에 예측 가능한 성능을 더한 러스트의 기능이 어떤 식으로 메

www.yes24.com