[RUST vs C++] 17. Standard Library Traits
https://google.github.io/comprehensive-rust/std-traits.html
Standard Library Traits - Comprehensive Rust 🦀
This segment should take about 1 hour and 40 minutes. It contains: SlideDuration Comparisons10 minutes Operators10 minutes From and Into10 minutes Casting5 minutes Read and Write10 minutes Default, struct update syntax5 minutes Closures20 minutes Exercise:
google.github.io
Rust는 일반적인 여러 계산에 대해 Trait으로 구현한다.
더하기를 하고 싶으면, add Trait을 구현하면 더하기 연산이 됨.
+=를 하고 싶으면 AddAssign Trait을 구현하면 += 연산이 됨.
17.1 Comparisons
그럼 이런 애들은 어떤 애들이던 간에 Type이 한결같다. 두가지만 빼고.
- Eq
: PartialEq
- Ord
: PartialOrd
이렇게 두가지로 나뉜 이유를 설명하려면 이산수학을 해야 한다.
거기서 Relation이 있다. 그럼 이제 Equivalence라는 이야기가 나온다.
거기서 Equivalence Relation(동치관계)의 조건은 3가지.
- Reflexive : A = A
- Symmetric : A = B 이면 B = A 이다.
- Transitive : A = B 이고, B = C 이면, A = C 이다.
이때, 요 3가지를 전부 만족하면 우리는 Full Equivalence Relation이라 하면,
아래꺼 두개만 만족하면 Partial Equivalence Relation이라 한다.
- Eq 이건 Full Equivalence Relation.
: PartialEq 이건 Partial Equivalence Relation.
이번엔 Ord. f32, f64가 대표적인 예시이다.
A = A에서 NaN.
부동소수점엔 NaN라는게 있다.
그런데, NaN = NaN이라 정의할 수 없음. 숫자가 아닌 것들이 같다고 나타낼 방법이 없음.
그래서, 대부분의 타입은 Eq와 Ord가 구현되어 있으나, f32, f64는 PartialEq와 PartialOrd만 구현되어 있음.
여기서 이렇게 나뉨에 따라 생기는 나비효과?
- Sorting을 한다 치자. 둘이 같은지 비교해야 하는데, f32와 f64는 A = A비교가 안되므로
f32, f64는 Sorting이 불가하다.
Eq의 return type은 bool, Ord의 return rype은 Ordering(Less, Eq, Greater) 타입이다.
PartialEq의 return type은 Option<bool>
PartialOrd의 return type은 Option<Ordering>
그럼 이런 Partial들은 어떻게 sort할까?
sort_by{| | _ } 이런 식으로, 각각에 대해 나뉘어야 함. "직접" 구현 필요.


17.2 Operations
연산자 오버로딩도 다 되어 있지만, 보통은 derive 쓰는게 편하다.
17.3 From and Into는 이미 해던 얘기.
17.4 Casting
Rust는 암시적 형변환 존재X. 오직 명시적 형변환만 제공.
17.5 Read and Write
- 어떤 값을 읽거나 쓰고 싶다면, Read Trait과 Write Trait을 구현하면 된다.
- Read Trait이 정의되어 있다면, 읽는 동작이 가능하다는 뜻.(Write도 마찬가지)
17.6 Default, struct update syntax
Default는 어떤 구조체의 기본 구조를 정의하고자 하는 Trait.
17.7 Closures
Closure는 C++에서 Lambda Expression이다.
- 익명함수 라고도 불리는 람다 표현식. 왜 쓰냐? 그때만 쓸라고 쓴다.
람다함수에서 가장 큰 배울 점은 Capture.
*Capture
[&, =a]
[=, &a]
[&]
[=]
[&a]
[=a]
🎁 여섯개의 차이가 뭘까?
일단 종류는 =, &만 있다.
=는 copy capture. &은 reference capture.
암튼 C++의 람다 표현식 같은게, Rust에선 Closure.
: 이름을 명명하지 않고, type이 있는 것들.
여기서 재밌는게, 람다 표현식도 엄밀히 Type이 있고, Closure도 Type이 있을 것이다.
Fn / FnOnce / FnMut
=> Closure, 일회용 Closure, 값 변경 가능한 Closure

일단 Closure는 할게 워낙 많아서 나중에 따로 설명..