소소한 개발 공부
[Rust] use 키워드 본문
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::*;
'프로그래밍 > Rust' 카테고리의 다른 글
[Rust] 컬렉션 - 해시맵 (0) | 2023.08.11 |
---|---|
[Rust] 보편적인 프로그래밍 개념(데이터 타입 / 함수 / 주석 / 제어문) (0) | 2023.07.26 |
[Rust] 러스트 설치하기 - Windows (0) | 2023.07.24 |
[러스트] 추리 게임 (0) | 2023.07.18 |
[러스트] 불변성 (0) | 2023.07.17 |