본문 바로가기

Rust Programming

[Rust] 4. Traits: Associated and generic types, Clone trait, Copy trait 지금까지 배운 두 가지 traits인 From과 Deref에 대해 다시 확인해보자.pub trait From { fn from(value: T) -> Self; } pub trait Deref { type Target; fn deref(&self) -> &Self::Target; } 둘 다 type parameters를 feature로 한다. From의 경우, generic parameter인 T이고 Deref의 경우, associated type인 Target이다. 차이점이 무엇일까? 왜 서로 다른 것을 사용할까? deref coercion이 동작하는 방식 때문에, 주어진 type에 오직 하나의 target type이 올 수 있다. (String은 오직 str에만 deref 가능하다) 그것은 ambig.. 더보기
[Rust] 4. Traits: Deref trait, Sized trait, From trait 이전 exercise에서 할 것이 별로 없었다. 그저 이 코드를impl Ticket { pub fn title(&self) -> &String { &self.title }} 이 코드로 바꾸면 끝이었다.impl Ticket { pub fn title(&self) -> &str { &self.title }} 하지만 뭔가 이상하다는 것을 눈치채야한다. 아래 사실들을 따라가보자.self.title은 String이다.그래서 &self.title은 &String이다.수정된 title method의 output은 &str이다.따라서 당신은 compile error를 예상했을 것이다.Expected &String, found &str과 같은...하지만, 동작한다. 왜?  .. 더보기
[Rust] 4. Traits: Derive macros, Trait bounds, String slices 직접 Ticket의 PartialEq를 짜는 것은 지루한 과정이었다.그렇지 않나?게다가 구현은 또 빡세다..만약, struct의 정의가 바뀌면(새로운 field가 추가된다던지) PartialEq 구현을 수정해야한다. 하지만 아래와 같이 destructuring을 통해 구조체의 형태를 정해줌으로써, risk를 줄일 수 있다.impl PartialEq for Ticket { fn eq(&self, other: &Self) -> bool { let Ticket { title, description, status, } = self; // [...] }} Ticket의 정의가 바뀌면, compiler는 er.. 더보기
[Rust] 4. Traits: Trait, Orphan rule, Operator overloading 이전 chapter에서 Rust의 type과 ownership system에 대해 배웠다.이제 좀 더 깊게 들어가서 traits에 대해 배울 것이다. traits에 대해 배우면, 모든 곳에 그것을 적용시킬 수 있을 것이다.사실 이전 Chapter에서 tratis에 대해 이미 봤다..into() 호출 뿐만 아니라 ==나 + operator가 그렇다. Rust의 standard library에 정의된 핵심 traits에 대해서도 다룰 것이다.Operator traits(Add, Sub, PartialEq, etc.)From, Into(infallible conversions)Clone, Copy(copying values)Deref, deref coercionSized(size를 표시하는 것)Drop(사용자.. 더보기
[Rust] 3. Ticket v1: Heap, References, Destructors stack은 좋지만 모든 문제를 해결할 수 없다.size가 compile time에 정해지지 않은 data는 어떻게 할 것인가? Collections나 strings, 그리고 다른 dynamically-sized data는 stack에 모두 할당될 수 없다.그래서 heap이 등장했다.  당신은 heap을 큰 메모리의 덩어리로 시각화할 수 있다.(큰 배열이라 생각해도 된다.)heap에 data를 저장할 때마다, heap의 어떤 영억을 할당받기 위해,allocator라는 특별한 프로그램에 요청해야한다. 우리는 이러한 상호작용을 heap allocation이라 한다.만약 allocation이 성공하면, allocator는 예약된 block의 시작 pointer를 당신에게 줄 것이다.  heap은 stack과 .. 더보기
[Rust] 3. Ticket v1: Encapsulation, Ownership, Setters, Stack 앞에서 modules와 visibility에 대해 기본적인 이해는 했을 것이다.다시 encapsulation으로 돌아와보자.encapsulation은 object의 내부적인 것들을 숨기는 행위다.보통 object의 상태를 바꾸지 못하게 하는 것에 사용된다. Ticket struct로 돌아가보자.struct Ticket { title: String, description: String, status: String,} 만약 모든 filed가 public으로 만들어졌다면, 그것은 encapsulation이 아니다. 엄격한 룰을 적용하려면, 개발자는 fileds를 private으로 설정해야한다.그리고 public methods를 사용자에게 제공하여 제한된 사용을 하도록 해야한다.그러한 publi.. 더보기
[Rust] 3. Ticket v1: Structs, Validation, Modules, Visibility Rust를 정말 특별하게 만드는 ownership을 이번 Chapter에서 배울 수 있다고 한다.ownership은 garbage collector없이 Rust를 memory-safe하고 효율적이게 만들어준다. software project의 bugs, features, tasks를 추적할 수 있는 (JIRA-like) ticket을 사용할 것이다.그래서 아래와 같은 Rust의 새로운 concepts를 베울 것이다. Rust의 custom types인 structOwnership과 references와 borrowingStack, heap, pointers, data layout, destructorsModules, visibilityStrings 여느 때와 같이 배울 준비 됐다는 exercise가 있다.. 더보기
[Rust] 2. A Basic Calculator: while, for, Over(Under)flow, Saturating, as casting 앞의 factorial exercise는 재귀를 사용하도록 강제했다.이제, 같은 작업을 loop를 사용하여 구현하는 방법을 배울 것이다.  while loop는 조건문이 true인 한, 코드블록을 계속 실행하는 것이다.while { // code to execute} 일반적인 문법은 위와 같다. let sum = 0;let i = 1;// "while i is less than or equal to 5"while i  위 코드는 i가 5보다 작거나 같지 않을 때까지, sum에 i를 더하고 i에 1을 계속 더해주는 코드다.하지만! 위 코드는 에러가 난다.왜? error[E0384]: cannot assign twice to immutable variable `sum` --> src/main.rs:7.. 더보기