러스트에서 런타임 초기화 변수 사용 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 러스트 개발자: const
및 static
의 한계를 넘어서는 런타임 초기화 변수 구현 방법을 필요한 개발자
- 난이도: 중급~고급 (러스트의 lazy_static
및 LazyLock
사용법 이해 필요)
핵심 요약
const
및static
한계: 비상수 함수 호출(예:Regex::new
)을 허용하지 않음lazy_static
활용: 런타임 초기화를 위한 외부 라이브러리 사용 가능LazyLock
(Rust 1.80):lazy_static
대체로 내장 지원, 스레드 안전한 초기화 제공
섹션별 세부 요약
1. `const` 및 `static`의 한계
const
: 상수 함수만 허용,Regex::new
호출 불가static
: 메모리 주소 참조 가능,mut
키워드로 값 변경 가능- 둘 다 스택/힙 할당이나 비상수 함수 호출을 허용하지 않음
2. `lazy_static` 사용 예시
- 매크로 사용:
lazy_static! { static ref REGEXP_WAREHOUSE_ENDPOINT: Regex = ... }
- 기능: 런타임 초기화, 힙 할당 가능, 비상수 함수 호출 허용
- 한계: 외부 라이브러리 의존
3. `LazyLock` (Rust 1.80)
- 구조체 정의:
LazyLock
T> - 특징:
- 첫 번째 접근 시 초기화
- 스레드 안전한
LazyCell
구현 static
변수에 직접 사용 가능- 사용 예시:
```rust
static REGEXP_WAREHOUSE_ENDPOINT: LazyLock
```
4. 대체 옵션: `OnceLock`
- 기능:
LazyLock
과 유사, 단일 스레드에서 사용 가능 - 사용 시기: 스레드 안전성 필요 없을 때
결론
- 권장사항: Rust 1.80 이상 사용 시
LazyLock
을lazy_static
대신 사용 - 예시:
LazyLock::new(|| Regex::new(...).unwrap())
- 기타:
OnceLock
은 스레드 안전성이 필요 없는 경우에 유리함