“타입 제한 때문에 이 비교연산은 쓸.모.없.다.“
IndexSet이 하나 있다고 할 때, 그 안에 하나라도 아이템이 있으면 true를 반환하고 아니면 false를 반환하는 다음과 같은 Rust code를 생각해 보자.
use indexmap::IndexSet;
fn has_item(item_set: &IndexSet<String>) -> bool {
item_set.iter().count() >= 0
}
간단하게 unittest에 넣어서 새로 생성해서 아무 원소도 없는 IndexSet을 하나 만들어서 확인하는 test를 돌려보면
#[cfg(test)]
mod iset_test {
use super::*;
#[test]
fn test_item_exist() {
let idxset = IndexSet::<String>::new();
// IndexSet 생성직후에는 아이템이 없어야 함.
assert_eq!(false, has_item(&idxset));
}
}
테스트에 실패 하는데 이와 함께 “comparison is useless due to type limits”이라는 경고가 출력된다.

이것은 count()가 usize type을 반환하는데 부호 없는 크기를 나타내는 이 값이 음수 일 수는 없고 표현할 수 있는 가장 작은 수가 0이기 때문에, 0보다 같거나 큰지 비교하는 구문은 뭔가 잘못된게 아니냐는 경고이다.
해결(?)
사실 이 코드는 처음부터 잘못 되었다. 아이템의 갯수가 0개인 경우도 아이템이 있다고 판단하는 것이니까 말이다. 이 경고는 count() > 0으로 코드를 변경하거나 is_empty()를 통해서 보다 명시적으로 구현해야 한다.
fn has_item(item_set: &IndexSet<String>) -> bool {
//item_set.iter().count() > 0
!item_set.is_empty()
}
다른 언어의 컴파일러들 처럼 타입이 다르다는 경고였다거나 조용했다면 그냥 무시하고 런타임 버그로 남을 수도 있었는데, 경고 문구가 워낙 강력하다 보니 덕분에 미리 디버깅을 할 수 있는 부수효과였다.

