2017-12-15 19 views
2

내가 열거해야하지만`if` 문에 어떤 열거 형이 포함되어 있는지 신경 쓰지 않으면 그것을 어떻게 사용합니까?</p>이 <pre><code>#[derive(PartialEq, Eq)] enum Foo { A, B(usize), } </code></pre> <p>내가 <code>baz</code>처럼 다른 논리를 포함 <code>if</code> 문에서 사용할 수 있습니다 :

fn bar(foo: &Foo, baz: bool) { 
    if foo == &Foo::B(3) || baz { 
     println!("Do stuff") 
    } 
} 

을,이 컴파일되지 않습니다 :

fn bar(foo: &Foo, baz: bool) { 
    if foo == &Foo::B(_) || baz { 
     println!("Do stuff") 
    } 
} 

방법 B에 어떤 값이 포함되어 있는지 신경 쓰지 않으면 if 문에 사용합니까?

답변

2

그것은이 경우에 match를 사용하는 것이 더 쉬울 것입니다 :

fn do_stuff() { 
    println!("Do stuff") 
} 

fn bar(foo: &Foo, baz: bool) { 
    match foo { 
     &Foo::B(_) => do_stuff(), 
     _ => { 
      if baz { 
       do_stuff(); 
      } 
     } 
    } 
} 

또는 if let로 :

fn bar(foo: &Foo, baz: bool) { 
    if let &Foo::B(_) = foo { 
     do_stuff(); 
    } else { 
     if baz { 
      do_stuff(); 
     } 
    } 
} 

난 당신이 쉽게 하나의 상태로 모든 것을 해낼 수 모르겠어요, 불행히도 do_stuff을 반복합니다.

+2

당신은 ('do_stuff의 중복을 제거 할 수 있습니다)' '(foo, baz)'와의 매칭 : [link] (https://play.rust-lang.org/?gist=32d81133f7131c508c0c8689329e22d0&version=stable). 비록 당신은 그것을 더 유지할 수 있다고 생각할 수도 있고 그렇지 않을 수도 있습니다. – trentcl

+0

'foo == & Foo :: B (_) || 어떤 이유가 있을까요? 미래에 언젠가는 언어에 baz {'를 추가 할 수 없습니까? – HiDefender

+1

@HiDefender 문제가 있습니다 : https://github.com/rust-lang/rfcs/issues/935 – mrhania

1

당신은 std::mem::discriminant 사용할 수 있습니다

use std::mem::discriminant; 

#[derive(PartialEq, Eq)] 
enum Foo { 
    A, 
    B(usize), 
} 

fn main() { 
    let to_test = Foo::B(123); 
    let some_bool = true; 

    if discriminant(&to_test) == discriminant(&Foo::B(0)) && some_bool { 
     println!("Do stuff"); 
    } 
} 

를이 많이 테스트해야하는 경우, 나는 그것을하는 방법을 구현하는 방법을 조언 :에 의해

impl Foo { 
    fn is_b(&self) -> bool { 
     discriminant(self) == discriminant(&Foo::B(0)) 
    } 
}