문제의 배경:
Rust는 명시적 초기화 철학을 채택하고 있습니다. 일부 표준 컬렉션 및 제네릭 유형에는 "기본값"이 필요할 때가 많습니다. 그러나 복잡한 구조체의 경우 매개변수 없이 어떻게 생성해야 하는지가 모호한 경우가 많습니다. 이를 위해 기본 생성자를 정의하는 trait Default가 도입되었습니다.
문제:
기본값이 기대되는 일반적인 컨테이너 및 알고리즘을 작성하려면 인수를 전달하지 않고도 인스턴스를 생성할 수 있는 메커니즘이 필요합니다. 하지만 모든 유형이 이러한 생성자에 적합한 것은 아닙니다. 경우에 따라 기본값이 명확하지 않거나 위험할 수 있습니다.
해결책:
default() 메서드를 제공하고, 여기서는 특정 인스턴스(일반적으로 "빈" 인스턴스, zeroed 인스턴스 또는 전제 조건을 가진 인스턴스)를 반환합니다.코드 예:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
주요 특징:
T: Default인 경우 Option<T>에 대해 Default::default가 강제로 호출되나요?
아니요, Optional은 T에 대해 default를 자동으로 호출하지 않습니다; unwrap_or_default가 명시적으로 호출됩니다.
구조체의 생성자에서 기본값이 Default trait을 통해 설정될 수 있나요?
아니요, Default는 전체 구조체를 생성하며, 개별 필드를 기본값으로 바꿀 수 없습니다.
구조체의 필드가 Default를 구현하지 않으면 derive(Default)가 실패할 수 있나요?
네, derive(Default)는 구조체의 모든 필드가 Default를 구현할 때만 작동합니다.
Config c Default, 여기서 서버 포트가 0(유효하지 않은 기본값)입니다. 프로그램이 예상치 않게 잘못된 포트에서 실행됩니다.
장점:
단점:
안전하고 합의된 기본값(retries=3, verbose=false)을 가진 설정 구조체의 Default.
장점:
단점: