1. 정적 메소드나 필드도 포함가능 이 경우 동적 디스페치가 불가능
2. impl 블록과 대상타입 선언이 분리돼있음
구현대상이나 trait중 하나만 라이브러리 안에있으면 어디서나 구현이 가능함
반대로 외부 라이브러리의 타입에 외부 라이브러리의 trait를 구현하는건 불가능
3. 제네릭 타입에 따라 구현하는 trait와 메소드들이 다를수있음
Vec<T>는 T: Clone일때만 Clone을 구현하고 T: Eq일때만 Eq를 구현함
그리고 T: Ord여야만 sort 메소드를 사용할수있음
4. 제네릭 타입에 대해서 trait를 구현할수있음
이렇게 해두면 Into<T>를 구현하는 모든 타입 U에 대해
T: TryFron<U>가 성립함
5. use를 안쓰고 baz.bar()식으로 그냥 쓸순없음
안쓰고 쓸려면 foo::Bar::bar(&baz) 식으로 모두 명시해야함
rust도 existential type 비슷한거 있냐?
정확히 그 이름으로 있긴한데 다른 언어랑 같은지는 모르겠다
dynamic dispatching 할때 쓰는거 맞음? 러스트는 다른 방법으로 해결한다고 들었는데 러스트도 existential type 쓰나보네
아니 동적 디스페치는 trait object라고 dyn 붙여서함 existential type은 그냥 alias 같은녀석
클로저같은 무명타입들 박싱없이 리턴한다거나 복잡한 타입들 깔끔하게 만든다거나 할때씀
뭔사 trait object랑 existential type이랑 사실 같은것 같은데 깊게 안봐서 모르겠다
뭔가
ㄴㄴ 전혀 다름 함수가 impl Fn() 리턴하면 'Fn()을 구현하는 무슨 타입'인데 Box<dyn Fn()> 리턴하면 그냥 Fn() 동적 디스페치하는거
둘다 타입 지우는건 똑같긴한데 전자는 컴파일타임에 타입을 알고는 있다