일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 적재도구loader
- 선형대수학
- 스레드전용저장소
- matrix
- 재배치
- 다이나믹 프로그래밍
- 대상파일
- unity
- 컴퓨터밑바닥의비밀
- 컴파일러
- Rust
- column space
- 코드포스
- 정적링크
- 다익스트라
- 백준
- CS정리
- vector
- 알고리즘
- 동적링크
- 심벌 해석
- c++
- 행렬
- eigenvalue
- 스레드전용리소스
- 벡터
- rust 스터디
- 구문트리
- 링커
- linear algebra
- Today
- Total
개발_기록용
[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는 할게 워낙 많아서 나중에 따로 설명..
'RUST 스터디' 카테고리의 다른 글
RUST 스터디[RUST vs C++] 13. Methods and Traits (1) | 2024.05.15 |
---|---|
RUST 스터디[RUST vs C++] 12. Pattern Matching (0) | 2024.05.13 |
RUST 스터디[RUST vs C++] 10. User-Defined Types (0) | 2024.05.13 |
[RUST vs C++] 16. 표준 라이브러리 (2) | 2024.05.12 |
[RUST vs C++] 15. Generic과 Template (0) | 2024.05.12 |