[rust] Rust 구조체에서 변수를 초기화하는 더 빠르고 짧은 방법이 있습니까?

다음 예제에서 필자는 필드 선언에서 구조체의 각 필드에 값을 할당하는 것을 선호합니다. 또는 각 필드에 대해 하나의 추가 문을 사용하여 필드에 값을 할당합니다. 내가 할 수있는 것은 구조체가 인스턴스화 될 때 기본값을 할당하는 것뿐입니다.

더 간결한 방법이 있습니까?

struct cParams {
    iInsertMax: i64,
    iUpdateMax: i64,
    iDeleteMax: i64,
    iInstanceMax: i64,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

impl cParams {
    fn new() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}



답변

트레이 트를 구현하여 구조체에 대한 기본값을 제공 할 수 있습니다 Default. default기능은 현재처럼 보일 것입니다 new기능 :

impl Default for cParams {
    fn default() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

그런 다음 기본값이 아닌 값만 제공하여 구조체를 인스턴스화 할 수 있습니다.

let p = cParams { iInsertMax: 10, ..Default::default() };

데이터 구조를 약간 변경하면 자동으로 파생 된 기본 구현을 활용할 수 있습니다. 당신이 사용하는 경우 #[derive(Default)]데이터 구조에, 컴파일러는 자동으로 기본 값으로 각 필드를 채우고 당신을위한 기본 기능을 생성합니다. 기본 부울 값은 false이고 기본 정수 값은 0입니다.

정수 필드가 기본적으로 -1이되기를 원하기 때문에 정수의 기본값이 0이면 문제가됩니다. 기본값 -1을 구현하는 새 유형을 정의하고 대신 사용할 수 있습니다.i64 구조체 있습니다. (나는 그것을 테스트하지 않았지만 작동합니다).

그러나, 나는 약간의 데이터 구조를 변경하고 사용하는 것이 좋을 것 Option<i64>대신에 i64. 코드의 컨텍스트를 모르지만 “무한”또는 “최대가 없습니다”라는 특별한 의미를 나타 내기 위해 특수 값 -1을 사용하는 것 같습니다. Rust에서는를 사용 Option하여 선택적으로 현재 가치를 나타냅니다. -1 해킹이 필요하지 않습니다. 옵션은 None또는 Some(x)x가 i64여기에 있는 곳일 수 있습니다. -1이 유일한 음수 값이면 부호없는 정수일 수도 있습니다. 기본값 OptionNone이므로 제안 된 변경 사항에 따라 코드는 다음과 같을 수 있습니다.

#[derive(Default)]
struct cParams {
    iInsertMax: Option<u64>,
    iUpdateMax: Option<u64>,
    iDeleteMax: Option<u64>,
    iInstanceMax: Option<u64>,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

let p = cParams { iInsertMax: Some(10), ..Default::default() };


답변