Rust 요약(기초)

By | 2022년 6월 24일
Table of Contents

Rust 요약(기초)

설치하기

curl https://sh.rustup.rs -sSf | sh

Hello, World!

프로젝트 생성

cargo new hello --bin
cd hello
ls -al

빌드

cargo build

실행

./target/debug/hello

변수생성

원격에서 ssh 연결 을 설정해 두면 편하다.

vi src/main.rs

가변형 / 불변형

rust 기본적으로 모든 변수는 불변형이다.(변경 불가)
mut 키워드를 붙여서 가변형 변수로 생성할 수 있다.
또는 기존에 선언한 변수를 다시 선언하면서 값을 바꾸는 것은 가능하다.

fn main() {
    let a = 1;
    a = a + 1;      // compile error

    let mut b = 1;
    b = b + 1;      // ok
}

정수형

overflow 에 상당히 민감하다.
cast 연산자를 붙여 주어야 오류가 발생하지 않는다.

use std::any::type_name;

fn type_of<T>(_: T) -> &'static str {
    type_name::<T>()
}

fn main() {
    let a: i8 = -128;
    let b: u8 = 255;

    println!("Signed a == {}, Unsigned b == {}", a, b);

    let a: i16 = 2;
    let c: i32 = a.pow(14) as i32;

    println!("c == {}", c);

    let d = 100;

    println!("type of d is {}", type_of(d));
}
Signed a == -128, Unsigned b == 255
c == 16384
type of d is i32

부동 소수점

상황에 따라 타입이 변한다.

fn main() {
    let x = 2.0;
    println!("type of x is {}", type_of(x)); // f64
}
fn main() {
    let x = 2.0;
    let y: f32 = 3.0;

    let z = x * y;

    println!("type of x is {}", type_of(x)); // f32
    println!("type of z is {}", type_of(z)); // f32
}

Boolean형

fn main() {
    let a = true;
    println!("type of a is {}", type_of(a));
}
type of a is bool

문자형

fn main() {
    let c = 'A';
    println!("type of c is {}", type_of(c));
}
type of c is char

복합형(tuple)

fn main() {
    let (a, b, c) = (1, 2, 3);
    println!("a + b + c == {}", (a + b + c));
}

배열(array)

fn main() {
    let a = [1, 2, 3, 4, 5];
    println!("a[1] == {}", a[1]);
}

제어문

괄호를 쓰면 컴파일러 경고가 뜬다.

if else

fn main() {
    let a = 1;
    if a > 1 {
        println!("over");
    } else if a < 1 {
        println!("below");
    } else {
        println!("equal");
    }
}

let if

fn main() {
    let a = true;
    let b = if a { 1 } else { 2 };

    println!("b == {}", b);
}

let with block

블록으로 값을 지정할 수 있다.

fn main() {
    let a = true;
    let b = {
        let a = 3;
        a + 1
    };

    println!("b == {}", b);
}

switch case

없나??

반복구문

for

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a.iter() {
        println!("{}", element);
    }

    println!("-----------");

    for number in (1..4).rev() {    // 4 는 제외
        println!("{}", number);
    }
}
10
20
30
40
50
-----------
3
2
1

while

fn main() {
    let mut num = 10;

    while num != 0 {
        println!("{}", num);
        num = num - 1;
    }
}

loop

fn main() {
    loop {
        println!("forever");
    }
}

함수(function)

fn main() {
    function_without_parameter();

    function_with_parameter(100, 200);

    let a = function_with_return_value();
    println!("a == {}", a);
}

fn function_without_parameter() {
    println!("function without parameter");
}

fn function_with_parameter(x: i32, y: i32) {
    println!("function with parameter x == {}, y == {}", x, y);
}

fn function_with_return_value() -> i32 {
    5       // 세미콜론을 붙이면 오류가 발생한다.
}

구조체(struct)

fn main() {
    let user1 = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        // active: true,
        // sign_in_count: 1,
    };

    println!("name of user1 is {}", user1.username);
    println!("email of user1 is {}", user1.email);
}

struct User {
    username: String,
    email: String,          // 마지막 콤마는 optional 이다.
    // sign_in_count: u64,
    // active: bool,
}

tuple struct

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(10, 0);

    println!("R value of black is {}", black.0);
    println!("x value of origin is {}", origin.0);
}

// tuple struct
struct Color(i32, i32, i32);
struct Point(i32, i32);

열거형(enum)

fn main() {
    let id: String = "id".to_string();
    let password: String = "abcd1234".to_string();

    if check_login(id, password) == ErrorCode::Ok {
        println!("login ok");
    }
}

#[derive(PartialEq)]
enum ErrorCode {
    Ok,
    InvalidId,
    InvalidPassword,
}

fn check_login(id: String, password: String) -> ErrorCode {
    if id != "id" {
        ErrorCode::InvalidId
    } else if password != "abcd1234" {
        ErrorCode::InvalidPassword
    } else {
        ErrorCode::Ok
    }
}

답글 남기기