2013-10-29 4 views
46

다음 예제에서는 필드 선언에서 구조체의 각 필드에 값을 할당하는 것을 선호합니다. 또는 필드에 값을 할당하기 위해 각 필드에 대해 하나의 추가 명령문을 효과적으로 사용합니다. 내가 할 수 있기를 원하는 것은 struct가 인스턴스화 될 때 기본값을 할당하는 것입니다.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, 
     } 
    } 
} 

답변

73

당신은 Default 특성을 구현하여 구조체에 대한 기본 값을 제공 할 수 있습니다. , 데이터 구조에 약간의 변화

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

을 : 당신 만 기본이 아닌 값을 제공하여 구조체를 인스턴스화 할 수

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

다음 default 기능은 현재 new 기능과 같을 것이다 자동으로 파생 된 기본 구현을 활용할 수 있습니다. 데이터 구조에 #[derive(Default)]을 사용하면 컴파일러는 각 필드를 기본값으로 채우는 기본 함수를 자동으로 작성합니다. 기본 부울 값은 false이며 기본 정수 값은 0입니다.

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

그러나 데이터 구조를 약간 변경하고 i64 대신 Option<i64>을 사용하는 것이 좋습니다. 코드의 컨텍스트를 알 수는 없지만 -1의 특수 값을 사용하여 "무한"또는 "최대 값 없음"을 나타내는 것처럼 보입니다. Rust에서는 Option을 사용하여 선택적으로 현재 값을 나타냅니다. -1 번 해킹 할 필요가 없습니다. 옵션은 None 또는 Some(x) 일 수 있습니다. 여기서 x는 여기에서 i64이됩니다. -1이 유일한 음수이면 부호없는 정수가 될 수도 있습니다.

#[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() }; 
+1

덕분에, 나는 빠른 읽기했지만, 나는 더 잘 이해하기 위해 다시 읽어 것입니다 : 코드는 다음과 같이 할 수있는 제안 된 변경 있도록 기본 Option 값은 None입니다. 일부 언어가 사용하는 "자연스런"기본값 (예 : 0, 거짓, ""등)은 저에게 적합합니다. 나는 해결할 나의 작은 "문제"보다 더 광범위한 함의가 있음을 이해합니다. 예를 들면 능력. "iVal : i64 = 0"은 나의 더 넓은 요구를 해결할 것입니다.하지만 그렇게되지는 않을 것입니다. "# [파생 (기본값)]"은 내 목표 대부분을 해결해야합니다. 나는 왜 테스트 프로그램에서 -1을 사용했는지 확신 할 수는 없지만 (역사적으로) 필요하지는 않습니다. 필드가 정의 된 위치에서 값을 지정할 수 있으면 매우 유용합니다 (IMHO). –

+4

@BrianOh, 접두사로, "구조체 필드의 기본 값"(즉'struct Foo {val : i64 = 0}'과 같은 것)이 제안되었으며 이후 버전에서 나타날 수 있습니다. – huon

+0

IMO가 구현 된 경우 좋을 것입니다. "struct foo {....". 내 질문에 작성된 구조체와 기본값을 사용하여 당신이 제안한대로 변경했습니다. 그것은 확실히 나에게 잘 어울리고 훨씬 더 간결합니다. 구문에 익숙하지 않은 나는 모든 기본 설정에 대한 구문을 알지 못했다. IE : "= cParams {iInsertMax : 10, ..Default :: default()};"를 사용했지만 "iInstanceMax"를 기본값으로 사용하고 싶습니다. IMO는 "# [deriving (Default)]"가 struct의 일부가되는 것이 바람직하지만 컴파일러가 더 적합하다고 생각합니다. –