다른 언어의 enum은 상수에 이름을 붙인것에 가깝지만 러스트 열거형은 값을 변수처럼 가질 수 있는게 가장 큰 특징입니다.
// boring some other language
enum Color {
Red, //0
Green, //1
Blue //2
};
// wonderful language rust
enum Message {
Quit, // 데이터 없음
Move { x: i32, y: i32 }, // 구조체 형태의 데이터
Write(String), // 튜플 형태의 데이터
ChangeColor(i32, i32, i32), // 여러 데이터
}
그리고 이넘을 다룰 땐 반드시 모든 경우의 수를 다 다루도록 문법적 제약이 있습니다.
fn process_message(msg: Message) {
match msg {
Message::Quit => println!("프로그램 종료"),
Message::Move { x, y } => println!("이동: {}, {}", x, y),
Message::Write(text) => println!("출력: {}", text),
Message::ChangeColor(r, g, b) => println!("색상 변경: {}, {}, {}", r, g, b),
}
}
그리고 러스트의 자랑스러운 널 세이프티와 에러 핸들링은 바로 이 열거형을 통해 이루어집니다.
널값 대신 널이 가능한 데이터는 옵션 타입으로 처리하며 옵션은 이넘이므로 널인 경우와 데이터가 있는 경우를 모두 처리해야 합니다.
enum Option<T> {
Some(T),
None,
}
에러가 발생할 수 있는 함수는 리절트 타입으로 처리해야하며 동작의 성공시 정상적인 값을, 실패시 에러 정보를 반환할 스 있습니다. 이를 호출하는 쪽은 반드시 정상동작과 에러상횡에 대한 처리를 해야합니다.
enum Result<T, E> {
Ok(T),
Err(E),
}
- dc official App
감사합니다
화이팅 - dc App
쥬우우우우웅우우우우우우우운ㄴ내 귀찮네
enum이아니라 union이네 - dc App
내부구현은 실제로 tagged union이랑 같음 - dc App
boaring ㅋㅋㅋㅋ 이게 찐러평이구나
드립을 알아봐줘서 고마워 - dc App
헉 시발 철자 틀렸었네 러평 ㅈㅅ합니다. - dc App
@ㅇㅇ(223.38) 글쓴이인척 하는 노잼찐따
@ㅇㅇ(211.235) 아니 저것도 작성자인 나 맞아. - dc App
그럼 그냥 노잼찐따
그런데 구조체를 이용해서 이걸 흉내내면 유사하게 에러 핸들링이 가능한 거 아님?
다른 언어도 리절트 타입 구현할 수 있을거 같긴 한데 라이브러리에서 그냥 throw 해버리는게 그냥 관례라서 일일히 래퍼 만들어야 하는 그런 문제가 있지 않겠는가 하는 생각이 든다. - dc App
당장 C++만 해도 표준의 std::expected로 본문처럼 에러헨들링이 가능함 근데 문제는 표준에 expected 쓰는 다른 api가 조또 없고 다 익셉션 던져서 노답읾
@ㅇㅇ(59.22) 이런건 언어 차원에서 강제하고 좀 밀어줘야 쓸만하지 각자 흉내내봐야 쓰기 힘듬
형님 기존프로젝트 포팅하면서 느끼는데 열거형 에러헨들링은 존나 씹 GOAT네요 형님
굿굿 - dc App