Rust에서 2가지 range operator로 구성된 Range 타입은 총 6가지다
이 6가지 타입은 모두 제네릭이고 모든 Sized 타입을 넣을수 있다 Sized란 예전에 말한 DSTs(dyn Trait, [T])가 아닌 타입을 말한다
그리고 모두 RangeBounds를 구현한다 얘네를 제네릭하게 다루려면 이걸 쓰면 된다
또 얘네는 제네릭이라 Python등의 언어와는 다르게 어떤 값을 넣어도 그에 대응되는 Range 객체를 만들수있다
물론 어떤 타입을 넣느냐에 따라 구현하는 트레잇이 달라지기 때문에 Index에 넣는다거나 Iterator를 구현한다거나 하는건 타입마다 달라진다
여기서 Range는 내부타입이 Step이여야만 Iterator를 구현하는데 char는 Step를 구현하지 않아서 Range(char)는 반복할수없다
그래서 보통 usize등 숫자타입으로 만들고 반복하거나 slice의 Index에 넣는 용도로 많이 쓰고 원한다면 커스텀 타입이나 트레잇을 도입해볼수도 있다
러스트를 글로만 배우고 짜본적은 없어서 궁금한데 저 type 6개가 traits일거 같은데 저거를 사용자정의 타입에 만들려면 6개 만들어줘야 되잖아 근데 구현은 다 똑같을꺼 같은데 그럼 6개 구현 어떻게 하는거임? copy&paste?
음 글을 다시 보니 6개 따로 구현하는게 아니라 공통되는 부분에 해당하는 trait이 또 있는 것이로군
6개 모두 struct임 trait은 RangeBounds
연산자 결과가 걍 구조체인거구나 assert_eq!((3..5), std::ops::Range { start: 3, end: 5 });
ㅇㅇ 넣은대로 필드에 넣어서 나옴
그럼 6개 각각 RangeBounds를 만들어줘야 된다는 구조같은데
https://doc.rust-lang.org/stable/std/ops/trait.RangeBounds.html#implementors
사실 내가 궁금한건 range보다 내가 이해하기로는 traits는 서로 따로따로잖어 A trait에 foo가 있어도 B trait에 foo가 필요하면 B에 또 만들어야 되는거라고 생각하고 있는데 내 생각이 맞으면 그런 반복은 어떻게 예쁘게 코딩하는건가 궁금한거임
두 foo가 똑같은 함수라면 supertrait 쓰던가 A + B
아 상속 없다는거 같아서 그럼 어떻게 하지 싶었는데 비슷한건 있었구나