웹애플리케이션을 만들 때 보면 외부 공개 모듈 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라는 정수리터럴에 타입 접미사가 붙여져있다. 이때 타입 접미사가 생략되어 있으면 러스트는 타입을 못박아줄 결정적인 단서가 되는 값을 찾을 때 까지 결정을 미룬다.
그리고 모듈을 파일별로 분리시킬 수 있다.
// 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
https://www.yes24.com/Product/Goods/116789691
'Rust' 카테고리의 다른 글
러스트 impl 트레이트 반환타입 (0) | 2024.01.16 |
---|---|
러스트 제네릭 스트럭트 (0) | 2024.01.15 |
러스트 제네릭(generic) 함수 정의 (0) | 2024.01.01 |
러스트 프로그래밍 - 스코프를 벗어나면 drop (0) | 2023.12.18 |
러스트 프로그래밍 - 참조 & 와 빌림(borrow) (0) | 2023.12.17 |