개발_기록용

[RUST vs C++] 17. Standard Library Traits 본문

RUST 스터디

[RUST vs C++] 17. Standard Library Traits

나폴나폴 2024. 5. 13. 00:05
728x90

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는 할게 워낙 많아서 나중에 따로 설명..

반응형
Comments