2013-06-09 3 views
5

사용자가 Rust로 작성한 간단한 함수에 명령 줄 인수를 전달하길 원합니다. int::from_str(args[1])을 사용하여 변환 할 수 있음을 알고 있지만 Option<int>을 반환합니다. 이는 int이있는 함수에 전달하기 위해 아래에 표시된 것과 같이 match 문을 사용해야합니다. 그러나 n 인수를 사용하면 2^n 가능성이 있습니다. 일련의 중첩 된 match 문장을 작성하는 것은 끔찍할 것입니다.루스트 열거 형을 부울 값으로 검사 하시겠습니까?

// will return either Some(int) or None 
let start = int::from_str(args[1]), end = int::from_str(args[2]); 
if typeof(start) == Some && typeof(end) == Some { 
    println(fmt!("You entered: %d, %d", start, end); 
} else { 
    println("Error with arguments."); 
} 

그런 방법이 있습니까? 그래서 열거 형의 어떤 멤버가 match이 아닌지 테스트 할 수 있습니까? 열거의

답변

6

변종은 (모두 NoneSome(foo)Option<int>이다이 경우) 모두 같은 유형, 그래서 당신이 실제로 수행 할 작업을 startend이 변형 검사입니다. 다행스럽게도 Rust는 몇 가지 옵션을 제공합니다.

코드의 직접 번역은 start.is_some() && end.is_some()을 사용하는 것입니다. 그러나 startend은 정수가 아니지만 Some(...) 변형으로 계속 감싸기 때문에 형식 문자열을 fmt!("You entered: %d, %d", start.get(), end.get())으로 수정해야합니다. (이 변형 테스트는 열거 형 단위로 작성해야하는 것이므로 열거 형에 대한 테스트를 수행 할 수있는 빌드 인 함수는 없습니다.)

더 많은 관용적 방법은 다음과 같습니다. :

// will return either Some(int) or None 
let start_opt = int::from_str(args[1]), end_opt = int::from_str(args[2]); 
match (start_opt, end_opt) { 
    // only matches if both are Some 
    (Some(start), Some(end)) => println(fmt!("You entered: %d, %d", start, end), 

    // will match when either (or both) are None 
    _      => println("Error with arguments."); 
} 
+0

아, 나는 경기에서 여러 개의 인수를 사용할 수 있다는 것을 몰랐습니다. 훌륭합니다. 나는 is_some() 메소드와 그와 유사한 메소드를 명시 적으로 써야 할 필요가있다. –

+0

@limp_chimp, correct, 표준 라이브러리의'Option'에'.is_some()'이 정의되어 있습니다; 그러나 당신이 당신 자신의 enum을 정의한다면, 자동으로 그것과 같은 메소드는 없을 것이다. – huon

+1

@limp_chimp : 실제로'is_some'의 구현을 보면,'! self.is_none()'이 있는데'match * self {None => true, Some (_) => false}'입니다. (그러나 여분의 메소드 호출을위한 퍼포먼스는 두려워하지 않으며, 이것들은 모두'# [inline]'으로 표시됩니다.) –

관련 문제