https://data-science.tistory.com/341
의 추가 내용입니다.
러스트로 프로그램을 작성하기 시작했을때 코드는 오로지 main함수 안에만 있을지도 모릅니다. 코드가 커짐에 따라서, 재사용 및 더 나은 조직화를 위하여 결국 어떤 기능을 다른 함수로 이동시킬 것입니다. 코드를 더 작은 덩어리로 쪼갬으로서, 각각의 덩어리들은 개별적으로 이해하기 더 수월해집니다. 러스트는 조직화된 방식으로 코드의 재사용을 할 수 있게 해주는 모듈(module) 시스템을 갖추고 있습니다.
cargo를 이용해서 새로운 프로젝트를 만드는 것으로 모듈 예제를 시작하려고 하는데, 바이너리 크레이트( crate)를 만드는 대신에 라이브러리 크레이트를 만들 것입니다.(라이브러리 크레이트란 다른 사람들이 자신들의 프로젝트에 dependency)로 추가할 수 있는 프로젝트를 말합니다.)
몇가지 일반적인 네트워크 기능을 제공하는 라이브러리의 뼈대를 만듭니다. 여기서는 모듈들과 함수들의 조직화에 집중할 것이고, 함수의 본체에 어떤 코드가 들어가야 하는지는 신경쓰지 않겠습니다. 이 라이브러리를 communicator라고 할것입니다. 라이브러리를 만들기 위해서는 --bin대신 --lib 옵션을 사용하면 됩니다.
$ cargo new communicator --lib
$ cd communicator
cargo가 src/main.rs 대신 src/lib.rs을 생성했음을 주목하세요. src/lib.rs 내부를 보면 다음과 같은 코드를 찾을 수 있습니다:
Filename: src/lib.rs
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
}
}
cargo는 우리가 만든 라이브러리의 작성 시작을 돕기 위해 빈 테스트를 만드는데, 이는 --bin 옵션을 사용했을때 “Hello, world!” 바이너리를 만들어준 것과 다릅니다.
src/main.rs 파일이 없기 때문에, cargo run 커맨드로 카고가 실행할 것이 없습니다. 따라서, 여기서는 라이브러리 크레이트의 코드를 컴파일하기 위해 cargo build를 사용할 것입니다.
이제 작성하는 코드의 의도에 따라 만들어지는 다양한 상황에 알맞도록 라이브러리 코드를 조직화하는 다양한 옵션들을 살펴보겠습니다.
모듈 정의
communicator 네트워크 라이브러리를 위해서, 먼저 connect라는 이름의 함수가 정의되어 있는 network라는 이름의 모듈을 정의하겠습니다. 러스트 내 모듈 정의는 모두 mod로 시작됩니다. 이 코드를 src/lib.rs의 시작 부분, 즉 테스트 코드의 윗 쪽에 추가해봅시다.
Filename: src/lib.rs
mod network {
fn connect() {
}
}
mod 키워드 뒤에, 모듈의 이름 network가 쓰여지고 중괄호 안에 코드 블록이 옵니다. 이 블록 안의 모든 것은 이름공간 network 안에 있습니다. 위의 경우 connect라는 이름의 함수 하나가 있습니다. 이 함수를 network 모듈 바깥의 스크립트에서 호출하고자 한다면, 우리는 모듈을 특정할 필요가 있으므로 이름공간 문법 ::를 이용해야 합니다: connect() 이렇게만 하지 않고 network::connect() 이런 식으로요.
또한 같은 src/lib.rs 파일 내에 여러 개의 모듈을 나란히 정의할 수도 있습니다. 예를 들어, connect라는 이름의 함수를 갖고 있는 client 모듈을 정의하려면, 아래 같이 이를 추가할 수 있습니다:
Filename: src/lib.rs
mod network {
fn connect() {
}
}
mod client {
fn connect() {
}
}
'Rust' 카테고리의 다른 글
[RUST] unwrap과 '?' (99) | 2023.08.07 |
---|---|
[RUST] Some (38) | 2023.08.06 |
[Rust] 주석 (107) | 2023.07.13 |
[Rust] model inference with CUDA (ONNXRUNTIME,ort) (61) | 2023.07.07 |
[Rust] Object Tracking in RUST with YOLOv8n ONNX model (78) | 2023.07.06 |