STUDY/Rust 28

Rust - 17. Cargo와 Crates.io

이건 뭘까 1. 릴리즈 프로필을 통한 빌드 커스터마이징하기 릴리즈 프로필: Cargo.toml에서 설정할수 있음 dev 프로필: 개발에 적합한 기본값으로 정의 release 프로필: 릴리즈용 설정을 기본값으로 정의 옵션 opt-level: 최적화 레벨. 0~3. 높을수록 최적화를 많이 하므로 컴파일 시간이 늘어남 dev: 0 release: 3 2. crates.io에 라이브러리 배포하기 크레이트 등기소(registry) 패키지 배포하는 곳 문서화 주석(document comment) 슬래시 세 개(///)를 사용. 텍스트 서식을 위한 마크다운 표기법 지원 문서화할 아이템 앞에 문서화 주석을 배치하면 됨 cargo doc을 실행하면 문서화 주석으로부터 HTML문서를 생성할수 있음. target/doc ..

STUDY/Rust 2024.03.19

Rust - 16. 반복자

클로저가 너무 길어져서 한번 끊었다. 1. 반복자 iterator fn main() { let test_v = vec![1, 2, 3]; let v_iter = test_v.iter(); for val in v1_iter { println!("{}", val); } } c++ iterator랑 비슷한듯 iterator는 next 메서드 사용가능함 소유권을 갖고 아이템을 소비함. -> mut 필요 2. 성능 비교 루프 vs 반복자 큰 차이 없다. 고수준의 추상화이지만 컴파일 되면 직접 작성한 저수준의 코드와 같은 수준으로 내려간다. https://doc.rust-kr.org/ch13-02-iterators.html

STUDY/Rust 2024.03.14

Rust - 15. 클로저

함수형 프로그래밍이다. 반복자: 일련의 요소들을 처리할수 있는 방법 -> 일련의 요소라고 하면 그냥 for로 부를수 있는 것들인가? 클로저: 변수에 저장할수 있는 함수와 유사한 구조 -> 변수에 저장하는 함수? 모던 자바스크립트나 파이썬에서 쓰는 느낌 1. 클로저 |args:input_type| -> output_type { /*code*/ } |args| { /*code*/ } || /*code*/ ex) || println!("hello, world"); |x| println!("hello, {}",x); 클로저: 변수에 저장하거나 다른 함수에 인수로 저장할수 있는 익명 함수 여기에 더해서 현재 상황을 캡처할수 있다. 캡처한다는게 말이 어렵거나 헷갈릴수 있는데 초기화 당시에 쓰인 변수나 파라미터들을..

STUDY/Rust 2024.03.11

Rust - 14. I/O 프로젝트 CLI 프로그램 만들기

드디어! 프로그램!! 프로젝트!!! 이건 전체챕터를 먼저 읽어보고 프로그램 만든 다음 정리하는 수준으로 작성해야지 내용이 그렇게 어렵진 않았는데 이전에 배웠던 내용들을 다시 복기해야해서 조금 오래 걸렸다. 프로그램에 인수를 사용하는 방법 cargo run -- arg1 arg2 ... 코드 내에서 인수를 사용하는 방법 use std::env; env::args().collect(); 파일 읽기 use std::fs; fs::read_to_string(file); 환경 변수 [ENV_VAL] cargo run -- args... main.rs lib.rs 로 분리하는건 쉽지않다. 그리고 pub을 사용해서 공개 설정하는 것과 라이프타임을 설정하는것은 아직 어렵다. https://doc.rust-kr.org/..

STUDY/Rust 2024.03.11

Rust - 13. 자동화 테스트

이제 나도 TDD 가능? 1. 테스트 코드가 의도대로 수행되는지 검증하는 것. 테스트 함수에 필요한 것 데이터 및 상태 설정 테스트 코드 실행 결과 비교 함수의 fn 이전 줄에 #[test] 를 추가하면 테스트함수로 사용할 수 있음. cargo test 명령어로 실행할 수 있음. 특정 인스턴스에서는 실행되지 않도록 할 수 있음. cargo test에 인수를 넘겨서 이름이 일치하는 테스트만 실행 하도록 할수 있음(필터링) Doc-tests ~~ : API 문서에 작성해 놓은 예제코드도 테스트 할 수 있음 결과 검사 assert! true 인 경우 pass false 인 경우 panic! 발생 assert_eq! assert_ne! should_panic: 에러조건 처리하는지 확인 내부에서 패닉이 발생해야 ..

STUDY/Rust 2024.03.07

Rust - 12. 라이프 타임

어제못했던거 이어서 공부.. 다시봐도 이해가 잘안되네.. 1. 라이프타임 참조자가 유효함을 보장하는 기간 라이프타임도 암묵적 추론이 가능하지만 여러 타입이 될 가능성이 있는 경우엔 타입을 명시해야함. 라이프타임 매개변수를 지정해도 전달되는 값이나 반환 값의 라이프타임이 변경되는 건 아님 제약조건을 지키지 않았을때 대여 검사기가 불합격 판정을 내릴수 있도록 하는것. 대여 검사기(borrow checker)로 스코프를 비교해서 대여의 유효성을 판단함. &i32 // 참조자 &'a i32 // 명시적인 라이프타임이 있는 참조자 &'a mut i32 // 명시적인 라이프타임이 있는 가변 참조자 'a와 같이 '(Apostrophe) + 짧은 소문자로 명시함. 라이프타임은 댕글링 참조(dangling referen..

STUDY/Rust 2024.03.05

Rust - 11. 제네릭 타입, 트레이트

오랜만에 러스트! 1. 제네릭 데이터 타입 제네릭(generic): 중복되는 개념을 효율적으로 처리하기 위한 도구 C++ 에서 사용하는 template 생각하면될듯하다 enum Option { Some(T), None, } enum Result { Ok(T), Err(E), } 제너릭 코드를 사용해도 런타임에서 느려지지 않음.(구체적인 타입을 사용했을때와 비교해도 느려지지않음) 2. 트레이트 동작을 제네릭한 방식으로 정의함. 특정 타입만 허용할 수도 있음. 다른 언어에서의 interface 와 유사함(하다고함) 트레이트 바운드(trait bound): 어떤 제네릭 타입 자리에 특정한 동작을 갖춘 타입이 올 수 있음을 명시할 수 있음 https://doc.rust-kr.org/ch10-00-generics..

STUDY/Rust 2024.03.04

Rust - 10. 에러 처리

대충 읽고 넘기려고했는데 안정적인 시스템을 위해선 에러처리가 중요해서... 다시 읽고 정리해야겠다. 복구 가능한 에러(recoverable error): 파일 없음과 같은 에러 . 사용자에게 문제 보고하고 재시도. 복구 불가능한 에러(unrecoverable error): 항상 같은 에러가 뜨는 경우. 프로그램 즉시 중단 ex) 배열 길이를 넘어서는 인덱스를 사용하는 경우 1. panic! 패닉을 발생시키는 방법 복구 불가능한 에러 발생 panic! 매크로 호출 패닉이 발생하면 실패 메세지 출력하고 되감은뒤(unwind; 어디서 에러가 났는지 추적), 스택을 청소하고 종료함 unwinding대신 aborting(즉각종료)을 수행하게 할 수 있음. 2. Result (복구 가능한)에러가 발생했을때 복구하는..

STUDY/Rust 2024.02.26

Rust - 9. 컬렉션(vector, string, hash map)

벡터, 해시맵 등 사용할수 있는 크레이트를 모아둔 듯하다. 컬렉션은 모두 힙에 저장되는 데이터라고 한다. https://doc.rust-lang.org/std/collections/index.html 표준 라이브러리 컬렉션은 여기서 확인! 1. 벡터 Vector 배열이랑은 다르다. c++의 벡터생각하면 될듯 2. 문자열 String 문자열은 어느 언어든 사용하지. UTF-8 문자열(String)은 인덱싱을 지원하지 않음 UTF-8 을 지원해서 유니코드의 스칼라값이 2바이트를 차지하므로 인덱스와 항상 대응하지 않음 3. 해시맵 Hash map 파이썬 딕셔너리, c++ 해시맵 등등 https://doc.rust-kr.org/ch08-00-common-collections.html

STUDY/Rust 2024.02.20

Rust - 8. 패키지, 크레이트, 모듈

c기준으로 header 만들고 라이브러리 숨기는 그런거 하는듯. 파이썬이면 바이너리로 만들고 api 문서 작성하는 그런 느낌이려나 1. 패키지와 크레이트 크레이트: 라이브러리나 실행 가능한 모듈로 구성된 트리 구조입니다. 컴파일 한 차례에 고려하는 가장 작은 코드 단위 여러 모듈을 담을수 있음. 모듈은 크레이트와 함께 컴파일 되는 다른 파일들에 정의되어있을수 있음. 바이너리일수도 있고 라이브러리 일수도 있음. 러스트에선 크레이트는 주로 라이브러리(라이브러리 크레이트)와 혼용해서 사용함. 바이너리 크레이트: 커맨드 라인 프로그램이나 서버 처럼 실행 가능한 실행 파일로 컴파일할수 있는 프로그램. main 함수를 포함하고 있어야함. cargo new {binary} src/{binary}.rs 라이브러리 크레..

STUDY/Rust 2024.02.19