본문 바로가기

Programming/Rust10

Rust 간단한 웹서버 HttpServer 올리기 제목 그대로 간단하게 Rust로 웹서버 올리기 - hello world! 찍어보기 프로젝트 생성 $ cargo new rust-actix-api Cargo.toml 에 crate 추가 [dependencies] actix-web = "3.3.2" main.rs 수정 use actix_web::{web, App, HttpResponse, HttpServer, Responder}; async fn index() -> impl Responder { HttpResponse::Ok().body("Hello world!") } async fn get_data(web::Path(id): web::Path) -> impl Responder { let data = format!("get_data {id}"); HttpR.. 2023. 4. 19.
docker compose - rust default 컨테이너 만들기 아래 2개 파일을 만들어야 한다, 도커는 기본 설치되어있어야 함 - docker-compose.yml - Dockerfile # docker-compose.yml name: rust services: backend: build: . stdin_open: true tty: true volumes: - .:/app # 현재폴더와 컨테이너의 /app과 mount # Dockerfile FROM debian:buster-slim ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ RUST_VERSION=1.68.2 RUN set -eux; \ apt-get update; \ apt-ge.. 2023. 4. 11.
Rust 의 await, Future, Poll 에 대해 Rust는 비동기 프로그래밍을 위해 async/await 문법을 제공합니다. async 함수는 비동기 코드 블록을 나타내며, await 키워드를 사용하여 비동기 호출을 기다리고 결과를 반환할 수 있습니다. Future는 Rust에서 비동기 작업을 표현하는 trait입니다. Future를 구현하는 타입은 작업이 완료될 때까지 실행을 일시 중지하고 결과를 제공할 수 있습니다. Future는 poll 메소드를 구현해야 합니다. 이 메소드는 작업이 아직 완료되지 않았거나 작업이 완료되었지만 결과가 아직 사용 가능하지 않은 경우 Poll::Pending을 반환하고, 작업이 완료되고 결과를 제공할 수 있는 경우 Poll::Ready를 반환합니다. 다음은 간단한 예시 코드입니다: use futures::Future;.. 2023. 3. 24.
Rust match match는 Rust에서 패턴 매칭을 수행하는 키워드입니다. 다른 언어에서는 switch와 유사한 기능을 수행합니다. 다른 언어의 switch문과 비교하여 Rust의 match문의 가장 큰 차이점은 각 분기(branch)마다 변수나 값에 대한 패턴을 지정할 수 있다는 것입니다. 이것은 Rust에서 매우 강력한 기능으로 여겨집니다. 다음은 Rust에서 match를 사용한 예제 코드입니다. let number = 5; match number { 0 => println!("Number is zero"), 1 => println!("Number is one"), 2..=10 => println!("Number is between two and ten"), _ => println!("Number is someth.. 2023. 3. 16.
Rust 매크로 macro_rules! Rust의 macro_rules! 매크로는 코드를 생성하는 Rust 코드의 일부입니다. 이 매크로를 사용하면 사용자 지정 매크로를 작성하여 Rust 코드의 작성과 유지 관리를 단순화할 수 있습니다. macro_rules! 매크로는 Rust 코드에서 기호 또는 패턴을 식별하고 이러한 패턴에 대해 매크로를 적용하는 방법을 지정합니다. 예를 들어, 이 매크로를 사용하여 새로운 함수를 생성할 수 있습니다. macro_rules! make_a_function { ($func_name: ident) => ( fn $func_name() { println!("Hello from {} function!", stringify!($func_name)); } ) } make_a_function!(my_function); f.. 2023. 3. 15.
Rust trait - 인터페이스?, 추상클래스? Rust에서 Trait은 다른 언어에서 인터페이스나 추상 클래스와 비슷한 역할을 합니다. Trait은 메서드와 관련된 동작을 정의하며, 구조체, 열거형, 또는 다른 Trait 등과 함께 사용될 수 있습니다. Trait을 사용하여 코드를 더 모듈화하고, 코드 재사용성을 높이고, 다형성을 제공할 수 있습니다. 다음은 간단한 예제입니다. 이 예제에서는 Trait을 사용하여 구조체가 지정된 Trait에 해당하는 메서드를 구현할 수 있도록합니다. trait Animal { fn name(&self) -> &'static str; fn make_sound(&self); } struct Dog { name: &'static str, } struct Cat { name: &'static str, } impl Anima.. 2023. 3. 14.
Rust 의 소유권(ownership)이란? Rust 언어의 소유권 시스템은 메모리 안전성과 동시성을 보장하기 위해 설계된 고유한 기능입니다. 이 시스템은 Rust 코드에서 객체의 소유권을 추적하여 런타임 오류인 "null pointer dereference"와 "dangling pointer"같은 일반적인 메모리 오류를 방지합니다. Rust에서 모든 객체는 변수에 바인딩되어 있으며, 각 변수는 그 객체의 소유자입니다. 이렇게 소유권이 지정된 객체는 다른 스코프로 전달될 때 소유권이 이전됩니다. 이를 "move"라고 부릅니다. 이렇게 소유권을 이전함으로써 객체의 수명을 추적하고, 객체에 대한 메모리 할당과 해제를 자동으로 처리할 수 있습니다. 또한, Rust에서는 불변 참조와 가변 참조를 구분합니다. 불변 참조는 객체의 소유권을 넘기지 않고도 객체.. 2023. 3. 13.
Rust 의 type : Some 에 대해.. Rust 언어에서 Some은 Option 열거형의 한 가지 값으로, 값이 있음을 나타냅니다. Option 열거형은 Rust에서 값이 있을 수도 있고 없을 수도 있는 값을 나타낼 때 사용됩니다. Some 값은 다른 값으로 래핑됩니다. 예를 들어, Some(5)는 5라는 값이 있음을 나타내며, Some("hello")는 문자열 "hello"가 있음을 나타냅니다. Some은 보통 패턴 매칭과 함께 사용됩니다. 예를 들어, 다음은 Option 열거형에서 Some 값을 추출하는 방법입니다: let x: Option = Some(5); match x { Some(n) => println!("The value of x is {}", n), None => println!("x is not set"), } 위 코드는 x.. 2023. 3. 10.
maturin, PyO3 - Rust 를 Python 에서 사용하자 Maturin 은 Rust 기반 Python 패키지를 구축하고 게시하는 도구이다 PyO3는 Python에서 rust코드를 실행할 수 있고, 반대로 rust에서 python 코드를 실행할 수 있게 도와주는 crate이다 // python 가상환경 활성화하고, 가상환경에 maturin 설치 $ pip install maturin $ mkdir temp & cd temp // rust project 시작, 위에서 만든 temp로 이름이 지정된다. $ maturin init -b pyo3 // 아래 파일들이 생성된다. rust 파일은 src/lib.rs // Cargo.toml, pyproject.toml 의 name을 변경하면 패키지 명을 변경할 수 있다 $ ls Cargo.toml pyproject.toml.. 2023. 3. 9.