본문 바로가기

Rust Programming

[Rust] 6. Ticket Management: Iterators, Iter, Lifetimes 초반 exercises에서 Rust가 for loops를 사용하여 collections를 iterate할 수 있게 해준다는 것을 배웠다. 우리는 거기서 ranges(ex. 0..5)를 봤고, arrays나 vectors와 같은 collections도 동일하게 동작한다.// It works for `Vec`s let v = vec![1, 2, 3]; for n in v { println!("{}", n); } // It also works for arrays let a: [u32; 3] = [1, 2, 3]; for n in a { println!("{}", n); } 이제 내부적으로 이것이 어떻게 동작하는지 이해할 때다. Rust에서 for loop를 쓸 때마다, compiler는 다음과 같은 code로.. 더보기
[Rust] 6. Ticket Management: Arrays, Vectors, Resizing 이전 chapter에서 우리는 아무것도 없는 Ticket을 modeling했다. 우리는 그것의 fields와 constraints를 정의했고, Rust에서 어떻게 표현하는것이 best인지 배웠다. 하지만 우리는 Ticket이 더 큰 system에서 얼마나 fit할지 고려하지 않았다. 우리는 이번 chapter에서 Ticket에 대한 간단한 workflow를 build할 것이다. (Ticket을 보관하고 검색하는 기본적인 관리 시스템) 해당 task는 다음과 같은 새로운 Rust concepts에 대해 배울 기회를 준다.Stack-allocated arraysVec: a growable array type, and slicesIterator와 IntoIterator: collections를 iteratin.. 더보기
[Rust] 5. Ticket v2: TryFrom trait, Error::source 이전 chapter에서 Rust의 관용적인 infallible type conversions인From과 Into traits에 대해 봤다. 이제 우리는 From과 Into의 오류에 대응되는 fallible인 TryFrom과 TryInto에 대해 이야기할 때가 됐다.  TryFrom과 TryInto는 From과 Into처럼 std::convert module에 정의되어있다.pub trait TryFrom: Sized { type Error; fn try_from(value: T) -> Result;}pub trait TryInto: Sized { type Error; fn try_into(self) -> Result;} From/Into와 TryFrom/TryInto의 큰 차이점은 T.. 더보기
[Rust] 5. Ticket v2: Packages, Dependencies, thiserror 이전에 TicketNewError의 Error trait을 구현하기 위한 code가 좀 필요했을 것이다.직접적인 Display 구현과, Error impl block을 추가하는 작업이 있었을 것이다. 우리는 thiserror를 통해 boilerplate을 제거할 수 있다.boilerplate이란?변경도 거의 없이 반복되는 코드를 의미한다. 사용자정의 error types의 생성을 간단하게 하는 procedural macro를 Rust crate는 제공해준다.하지만 우리는 조금 앞서나가고 있다고 생각한다.thiserror는 제3자 crate고, 그것은 우리의 첫번째 종속성이다. 우리가 종속성에 대해 배우기 전에 Rust의 packaging system에 대해 얘기해보자.  Rust package는 Carg.. 더보기
[Rust] 5. Ticket v2: Fallibility, Unwrap, Error enums, Error trait 이전 exercise의 Ticket::new function을 보자.impl Ticket { pub fn new(title: String, description: String, status: Status) -> Ticket { if title.is_empty() { panic!("Title cannot be empty"); } if title.len() > 50 { panic!("Title cannot be longer than 50 bytes"); } if description.is_empty() { panic!("Description cannot be empty"); } if description.len() > 500 { panic!("Description cannot be longer than 50.. 더보기
[Rust] 5. Ticket v2: Variants with data, Branching(if let and let/else), Nullability enum Status { ToDo, InProgress, Done,} 위와 같은 Status enum은 C-style enum이라고 부른다.각 variant는 named constant와 약간 유사한 간단한 label이다.당신은 C, C++, Java, C#, Python 등과 같은 많은 programming languages에서 이러한 enum을 찾을 수 있다. 그러나 Rust enum은 무언가 더 할 수 있다.각 variant에 data를 붙일 수 있다.  우리가 ticket작업을 하는 사람의 이름을 저장하길 원한다고 하자.우리는 ticket이 in progress인 경우만 이 정보를 얻을 수 있다.to-do ticket이나 done ticket일 경우는 정보를 얻을 수 없을 것이다... 더보기
[Rust] 5. Ticket v2: Enums, Branching(match) 이번 chapter에서는 Rust domain modelling skills를 다듬을 것이다. 우리는 아래와 같은 개념들을 배울것이다.enum, Rust의 data modeling에서 강력한 featuresOption type, nullable values를 model하기 위한Result type, recoverable errors를 model하기 위한Debug and Display traits, printing을 위한Error trait, error types를 표시하기 위한TryFrom and TryInto traits, fallible conversions를 위한Rust의 package system, library가 뭐고, binary가 뭐고, 다른 여러 crates를 사용하는 법00_intro e.. 더보기
[Rust] 4. Traits: Drop trait destructors에 대해 배울 때, drop function에 대해 얘기했었다.해당 type이 차지하던 memory(std::mem::size_of bytes)를 회수한다.해당 값이 관리하는 어떤 additional resource들(String의 heap buffer같은) 또한 clean up한다.Drop trait은 어디서 올까?pub trait Drop { fn drop(&mut self);} Drop trait은 compiler가 당신에게 자동으로 제공하는 것을 넘어,당신의 types에 대한 additional cleanup logic을 정의하는 mechanism이다.drop method에 넣은 것이 무엇이든, value가 scope를 벗어나면 실행될 것이다.  Copy trait에 대해.. 더보기