소소한 개발 공부

[Rust] use 키워드 본문

프로그래밍/Rust

[Rust] use 키워드

이내내 2023. 8. 10. 22:44

use 키워드로 경로 가져오기

1. use를 사용함으로써 함수를 가져오는 경로를 단축시킬 수 있다.

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
}

- 파일 시스템의 심볼릭 링크(symbolic link)를 생성하는 것과 유사

(* 심볼릭 링크: 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크)

- use로 가져온 경우도 privacy 규칙이 적용됨 -> 다른 스코프에서는 쓸 수 없음

 

1.1) 사용된 스코프 내에서만 단축 경로가 적용

아래와 같이 customer에 mod로 스코프를 바꾸면 hosting의 단축경로가 적용되지 않아 사용하지 않았다는 warning이 뜬다.

-> use도 customer 안으로 옮기거나 super::hosting으로 부모 모듈로의 단축 경로를 참조하면 가능

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting;

mod customer {
    pub fn eat_at_restaurant() {
        hosting::add_to_waitlist();
    }
}
warning: unused import: `crate::front_of_house::hosting`
 --> src/main.rs:7:5
  |
7 | use crate::front_of_house::hosting;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

1.2) 아래와 같이 경로를 모두 작성하는 경우도 가능하지만 함수를 호출할 때 부모 모듈을 명시적으로 보여주는 것이 보편적

가져온 함수가 어디 정의되어 있는지 알기도 좋음

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting::add_to_waitlist;

pub fn eat_at_restaurant() {
    add_to_waitlist();
}

1.2-1) 구조체나 열거형 등을 가져올 때는 전체 경로를 작성하는 게 보편적

- HashMap 표준 라이브러리 구조체를 use로 가져오는 예시

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, 2);
}

 

1.3) 동일한 이름의 아이템을 여럿 가져오는 경우 부모 모듈을 반드시 명시 -> 누구의 것을 가져오는지 알기 위해

- 동일한 Result 아이템을 같은 스코프에서 사용하는 예시

use std::fmt; // use std::fmt::Result 으로 쓰게되면 누구의 Result를 쓰는지 알 수 없다
use std::io;

fn function1() -> fmt::Result {
    // --생략--
}

fn function2() -> io::Result<()> {
    // --생략--
}

1.3-1) as 키워드로 별칭을 제공해 동일한 이름의 타입 구분 가능

use std::fmt::Result;
use std::io::Result as IoResult;

fn function1() -> Result {
    // --생략--
}

fn function2() -> IoResult<()> {
    // --생략--
}

2. pub use 로 다른 스코프에서도 사용 가능

다른 곳에서 사용할 수 있게 만들기 때문에 다시 내보내기(re-exporting)라고도 함

pub use crate::front_of_house::hosting;

 

3. 외부 패키지 사용하기

- Cargo.toml 에 외부 패키지를 의존성으로 추가

추가 시 cargo가 crates.io에서 의존성을 다운로드 하여 프로젝트에서 패키지를 사용할 수 있게 됨(use 키워드로 스코프로 가져와 사용)

// Cargo.toml
rand = "0.8.5"

// project
use rand::Rng;

* std 표준 라이브러리도 외부 크레이트이므로, Cargo.toml에 추가할 필요는 없지만 use로 스코프로 가져와야 사용할 수 있음

use std::collections::HashMap;

 

4. 중첩 경로를 사용해 대량의 use 나열 정리

use 중복되는경로{나뉘는 경로1, 나뉘는 경로2, ...}

 

use std::cmp::Ordering;
use std::io;

// 이거를, 아래와 같이 중첩 가능
use std::{cmp::Ordering, io};

// 중복되는 경로 그자체인 경우 self 를 중첩 경로에 작성 
use std::io::{self, Write};

5. glob 연산자 *

경로에 글롭 연산자를 붙이면 경로 안에 정의된 모든 public 아이템을 가져올 수 있음

-> all 의 의미

use std::collections::*;