반응형

Rust 48

[Rust] mut 변수

Rust 프로그래밍 언어에서 모든 변수는 "디폴트로" 불변성(Immutability)의 성질을 갖습니다. 불변성(Immutability)이란 변수에 값이 한번 지정된 후에는 그 값을 변경할 수 없는 특성을 말합니다. 반면에 mut는 변수의 값을 변경할 수 있는 변수입니다. 다음은 쓰레드나 프로세스 내부에서 mut변수를 선언하고 값을 변경합니다. let mut a = json!({...}); a.insert(...); ... } 하지만 외부에서 접근하여 해당 변수의 값을 변경하고자 한다면 해당 변수값은 쉽게 바뀝니다. 이는 Rust 스럽지 않은 코드입니다. 이를 해결하기 위해 다음과 같이 immutable 변수로 감싸줍니다 let a = { let mut a = json!({...}); a.insert(...

Rust 2024.02.15

[RUST] `static

데이터의 라이프타임(lifetime)을 나타내는 특별한 키워드입니다. `'static`은 프로그램 전체 수명 동안 지속되는 정적(static) 데이터를 표현합니다. `'static`은 라이프타임이 가장 긴 수명을 갖는 것으로 간주됩니다. `'static`은 다음과 상황에서 사용될 수 있습니다 1. 리터럴 데이터: 문자열 리터럴과 정수형 리터럴 같은 리터럴 값은 `'static` 라이프타임을 갖습니다. 이는 프로그램 실행 동안 변하지 않고 메모리에 상주하는 데이터입니다. let static_string: &'static str = "Hello, world!"; 2. 정적 변수: `static` 키워드로 선언된 정적 변수는 `'static` 라이프타임을 가집니다. 이러한 변수는 프로그램 전체에서 사용 가능하..

Rust 2023.08.13

[RUST] & * ` ' ' 다양한 기호

1. `&`: - `&`는 참조(reference) 연산자로 사용됩니다. - 변수 또는 값 앞에 `&`를 붙여 해당 값에 대한 참조를 생성합니다. - 참조는 값에 대한 불변 참조(immutable reference)를 생성하며, 해당 값에 대한 소유권을 이전하지 않고도 값을 참조할 수 있게 합니다. 2. `*`: - `*`은 역참조(dereference) 연산자로 사용됩니다. - 포인터를 역참조하여 해당 메모리 위치에 저장된 값을 얻습니다. - `*`는 포인터가 가리키는 값을 읽거나 수정할 때 사용됩니다. 3. `backtick`(`) 또는 `백틱`: - `backtick`은 Rust에서 일반적으로 사용되지 않는 문자입니다. 대신, 문자열 리터럴에는 역따옴표(`)가 사용됩니다. 4. `'` (작은 따옴표..

Rust 2023.08.12

[RUST] match

switch case문과 비슷합니다. match는 패턴 매칭을 사용하여 다양한 경우의 수에 대한 코드 블록을 처리하는 구문입니다. `match`는 값이 여러 가지 가능한 경우에 대해 일치하는 패턴을 찾고 해당하는 코드를 실행합니다. `match` 구문을 사용하는 이유 1. 모든 경우 다루기: `match`는 모든 가능한 경우에 대해 명시적으로 처리할 수 있습니다. `match`를 사용하면 모든 열거형 변형(variant)이나 다양한 패턴에 대해 분기 처리를 작성할 수 있습니다. 이는 프로그램의 완전성을 보장하고 예기치 않은 경우를 방지하는 데 도움을 줍니다. 2. 코드 가독성: `match`는 패턴 매칭을 사용하므로 코드의 의도를 명확하게 표현할 수 있습니다. `match`를 사용하여 코드를 작성하면 어..

Rust 2023.08.10

[RUST] if let

패턴 매칭을 사용하여 `Option`, `Result`, `enum` 등과 같은 대안적인 값을 다룰 때 편리하게 사용되는 구문입니다. `if let`을 사용하면 해당 값이 특정 패턴과 일치하는지 확인하고, 일치하는 경우에만 해당 블록의 코드를 실행할 수 있습니다. `if let`을 사용하는 이유 1. 대안적인 값 처리: `Option`이나 `Result`와 같은 대안적인 값을 다룰 때, `if let`은 해당 값이 실제로 존재하는지 확인하고 그 값을 사용할 수 있게 해줍니다. 예를 들어, `Option` 값이 `Some`인 경우에만 해당 값을 사용하고, `None`인 경우에는 특정 동작을 수행할 수 있습니다. 2. 코드 가독성: `if let`은 패턴 매칭을 사용하므로 코드의 의도를 더 명확하게 표현할 ..

Rust 2023.08.09

[RUST] unwrap과 '?'

두 연산자는 에러 처리와 결과 값의 추출을 간편하게 수행하기 위해 사용됩니다. 1. `unwrap`: - `Option` 또는 `Result` 타입에서 값을 안전하게 추출합니다. - `unwrap`은 `Option` 타입에서 `Some` 값을 추출하거나, `Result` 타입에서 `Ok` 값을 추출합니다. - `unwrap`은 값의 존재 여부를 검사하지 않고, 값을 강제로 추출합니다. 따라서, 값이 없는 경우(`None` 또는 `Err`)에는 패닉을 일으킬 수 있습니다. - 주로 디버깅이나 간단한 예제 코드 작성 시 사용되며, 실제 상용 코드에서는 에러 처리를 명시적으로 수행하는 것이 권장됩니다. 2. `?` (Question Mark Operator): - `?` 연산자는 함수나 메서드 내에서 `Res..

Rust 2023.08.07

[RUST] Some

Some은 `Option` 열거형의 변형 중 하나로, 값이 있는 경우를 나타냅니다. `Option`은 Rust에서 값의 존재 여부를 표현하는 타입이며, `Some`은 그 값이 있는 경우를 나타냅니다. `Some`을 사용하는 이유 1. 값의 존재 여부 표현: `Some`은 값이 존재하는 경우를 명시적으로 표현합니다. Rust에서는 `Option` 타입을 사용하여 값이 있을 수도 있고 없을 수도 있는 경우를 처리할 수 있습니다. `Some`은 값이 있는 경우를 나타내므로, 이를 통해 값을 정확하게 전달하고 처리할 수 있습니다. 2. 타입 안정성: `Option` 타입은 컴파일 시점에서 값의 존재 여부를 확인하여 타입 안정성을 제공합니다. `Option`을 사용하면 값을 명시적으로 `Some`으로 표현하거나 ..

Rust 2023.08.06

[Rust] mod와 파일 시스템

https://data-science.tistory.com/341 의 추가 내용입니다. 러스트로 프로그램을 작성하기 시작했을때 코드는 오로지 main함수 안에만 있을지도 모릅니다. 코드가 커짐에 따라서, 재사용 및 더 나은 조직화를 위하여 결국 어떤 기능을 다른 함수로 이동시킬 것입니다. 코드를 더 작은 덩어리로 쪼갬으로서, 각각의 덩어리들은 개별적으로 이해하기 더 수월해집니다. 러스트는 조직화된 방식으로 코드의 재사용을 할 수 있게 해주는 모듈(module) 시스템을 갖추고 있습니다. cargo를 이용해서 새로운 프로젝트를 만드는 것으로 모듈 예제를 시작하려고 하는데, 바이너리 크레이트( crate)를 만드는 대신에 라이브러리 크레이트를 만들 것입니다.(라이브러리 크레이트란 다른 사람들이 자신들의 프로..

Rust 2023.07.15

[Rust] 주석

유용한 문서화 주석 슬래시 세개(///)를 이용하여 텍스트 서식을 위한 마크 다운 표기법을 지원합니다. 문서화 주석은 문서화할 대상 바로 이전에 배치하면 됩니다. Filename: src/lib.rs /// Adds one to the number given. /// /// # Examples /// /// ``` /// let five = 5; /// /// assert_eq!(6, my_crate::add_one(5)); /// ``` pub fn add_one(x: i32) -> i32 { x + 1 } cargo doc --open 을 실행시키면 현재 크레이트의 문서에 대해 (심지어 크레이트가 가진 모든 디펜던시의 문서까지) HTML 을 생성하고 웹 브라우저에 띄워줍니다. 자주 사용되는 구절 - ..

Rust 2023.07.13

[Rust] model inference with CUDA (ONNXRUNTIME,ort)

https://crates.io/crates/ort에 따르면 cuda를 사용할수 있습니다.(cuda는 이미 설치되어있다고 가정합니다.) cargo.toml에 ort를 추가할때 feature로 load-dynamic이나 cuda가 있으면 cuda를 사용 할 수 있는것 같습니다. #[cfg(any(feature = "load-dynamic", feature = "cuda"))] cargo.toml에 아래 코드를 추가합니다. ort = {version="1.14.6", features = ["cuda"]} 그리고 main.rs에 use ort::ExecutionProvider 추가하고 main()함수 에서 ExecutionProvider::cuda().is_available() 로 확인할수 있습니다. buil..

Rust 2023.07.07