프로그래밍

    [Rust] 클로저

    러스트는 함수형 언어에 영향을 받아 만들어졌다. 그래서 반복자와 클로저라는 특성을 갖고 있다.클로저클로저는 변수에 저장하거나 다른 함수에 인수로 전달할 수 있는 익명 함수이다. 클로저를 만들고 다른 곳에서 클로저를 호출해 평가할 수 있다. 클로저는 정의된 스코프에서 값을 캡처할 수 있다.클로저로 환경 캡처하기티셔츠 회사에서 메일링 리스트에 있는 사람들에게 한정 티셔츠를 주는 이벤트를 한다. 사람들은 좋아하는 색상을 설정해두면 해당 색상의 티셔츠를 받을 수 있고, 설정을 안 했다면 회사가 가장 많이 보유 중인 색상을 받는다.#[derive(Debug, PartialEq, Copy, Clone)]enum ShirtColor { Red, Blue,}struct Inventory { shirts..

    [Rust] 테스트

    러스트에서는 함수의 동작을 테스트할 수 있는 문법을 제공한다. 테스트는 cargo test로 실행할 수 있고, 이 명령을 실행하면 테스트 실행 바이너리를 빌드한다.테스트 작성src/lib.rs#[cfg(test]mod tests{ #[test] //이 함수가 테스트 함수임을 명시 fn it_works() { let result = 2 + 2; assert_eq!(result, 4); //result의 값은 4와 같을 것 }}#[test]로 이 함수가 테스트 함수임을 명시한다. assert_eq! 매크로는 ‘result의 값이 4와 같을 것’이라고 단언(assert)한다. cargo test 로 실행하면 test result: ok. 라는 프롬프트가 뜬다.a..

    [Rust] 제네릭과 트레이트

    제네릭 데이터 타입제네릭을 사용하면 함수 시그니처나 구조체의 아이템에 다양한 데이터 타입을 사용할 수 있다.fn largest(list: &[T]) -> &T { let mut largest = &list[0]; for item in list { if item > largest { largest = item; } } largest}largest 함수는 어떤 타입의 벡터가 들어와도 받아들일 수 있다. 타입 매개변수 T 가 알아서 변신하는 느낌이다.struct Point { x: T, y: T,}fn main() { let integer = Point { x: 5, y: 10 }; let float = Point { x:..

    [Rust] 오류 처리

    러스트에는 복구 가능한(recoverable) 에러와 복구 불가능한 (unrecoverable) 에러가 있다. recoverable 에러는 Result 타입으로, unrecoverable 에러는 panic! 매크로로 처리한다.panic!코드가 실행되고 문제가 발생했지만 딱히 할 수 있는 일은 없을 수도 있다. 이런 panic 상황이 발생하면 실패 메시지를 출력하고, 되감고(unwind), 스택을 청소하고 종료한다. panic! 매크로를 사용하면 즉시 panic을 발생시킨다.fn main() { panic!("crash!");}//thread 'main' panicked at crashfn main() { let v = vec![1, 2, 3]; v[99];}벡터 크기보다 큰 인덱스에 접근..

    [Rust] 컬렉션

    컬렉션(collection)은 표준 라이브러리에 포함된 데이터 구조로, 벡터, 문자열과 같이 다수의 값을 담을 수 있으며, 힙에 저장되어 동적으로 할당된다.벡터같은 타입의 값만을 저장하는 구조이다.let v: Vec = Vec::new();let v = vec![1, 2, 3]; 벡터는 제네릭을 이용하여 구현되었다. 따라서 어떤 타입의 값을 저장할 것인지를 angle bracket ‘’으로 감싸서 명시했다(type annotation).초깃값을 함께 지정하는 경우 러스트에서 타입을 유추할 수 있으므로 생략할 수 있다. 이 때는 매크로 vec! 을 사용한다.벡터 활용let mut v = Vec::new();v.push(5);v.push(6);let first = &v[0];let second: Option..

    [Rust]프로젝트 모듈 관리

    패키지와 크레이트크레이트(crate)가장 작은 코드 단위이다. 바이너리 크레이트는 실행파일로 컴파일할 수 있는 프로그램이다. main 함수를 포함해야 한다.라이브러리 크레이트는 여러 프로젝트에서 공용될 의도로 만들어진 기능들이 정의되어 있는 크레이트이다. 일반적으로 ‘크레이트’라고 하면 라이브러리 크레이트를 말한다. 즉, ‘크레이트’라는 개념은 다른 언어에서의 ‘라이브러리’라고 볼 수 있다.크레이트 루트 (crate root)는 러스트 컴파일러가 컴파일을 시작하는 소스 파일이고, 크레이트의 루트 모듈을 구성한다.패키지(package)패키지는 여러 크레이트의 번들이다. 크레이트를 빌드하는 법이 설명된 Cargo.toml 파일을 포함한다. 패키지에는 여러 바이너리 크레이트가 포함될 수 있고, 라이브러리 크레..

    [Rust] 열거형

    열거형 정의열거형은 하나의 타입이 가질 수 있는 배리언트(variant)를 열거해 타입을 정의할 수 있도록 한다. 어떤 값이 여러 개의 가능한 값의 집합 중 하나라는 것을 나타낸다.IP주소는 ipv4, ipv6 두 가지 표준으로만 사용되므로, 열거형으로 모든 배리언트를 열거할 수 있다.enum IpAddrKind { V4, V6,}let four = IpAddrKind::V4;let six = IpAddrKind::V6;열거형을 정의할 때 식별자로 네임스페이스가 만들어지므로 각 배리언트 앞에 :: 을 붙여야 한다.enum IpAddr { V4(String), V6(String),}let home = IpAddr::V4(String::from("127.0.0.1"));let loopb..

    [Rust] 구조체

    구조체 정의와 인스턴스구조체를 정의하려면 struct 키워드와 구조체에 지어줄 이름을 입력한다.필드에는 각 구성 요소의 이름과 타입을 정의한다. struct User { active: bool, username: String, email: String, sign_in_count: u64,}fn main() { let mut user1 = User { active: true, username: String::from("someusername123"), email: String::from("someone@example.com"), sign_in_count: 1, }; user1.email = String::from("a..