[rust] 3. Common Programming Concepts

Jiseok Son·2023년 9월 10일
0

📌 "The Rust Programming Language"를 읽고 남긴 기록

변수, 타입, 함수, 제어 흐름 등 대부분의 프로그래밍 언어에서 다루는 개념이 rust에서는 어떻게 동작하는지 알아보자.

1. Variables and Mutability

fn main() {
    // 1. variable mutability
    let mut x = 5;
    println!("value of x is {x}");
    x = 10;
    println!("value of x is {x}");

    // 2. const
    const SECONDS_PER_DAY: i32 = 24 * 60 * 60;
    println!("MINUTES_PER_DAY: {MINUTES_PER_DAY}");

    // 3. shadowing
    let name = "Jiseok Son";
    println!("My name is {name}");
    let name = name.len();
    println!("Length of name string is {name}");
}
  • 모든 변수는 기본적으로 immutable이다. mutable한 변수 정의는 mut 키워드를 이용한다.
  • const 정의에는 반드시 타입을 명시해야 한다.
  • 이미 정의된 변수와 같은 이름의 변수를 다시 정의할 수 있다. 이를 Shadowing이라 하며 변수 이름을 통해 가장 최근에 정의된 변수에만 접근할 수 있다.
// let raw_user_data = fetch_something();
// let user_data = raw_user_data.json();

let user_data = fetch_something();
let user_data = user_data.json();

shadowing을 통해 불필요하게 새로운 변수 이름을 정하지 않아도 된다.

2. Data types

fn main() {
    // 1. scalar type
    let a = 10;
    let b: i32 = 12;
    let c: f64 = 3.14;
    let d: u8 = b'A'; // only u8
    let e = 1_000_000;
    let f: bool = true;

    // 2. compound type
    let tup1: (i32, f64, u8) = (500, 6.4, 1);
    let el = tup1.1; // accessing element by .
    println!("second element: {el}");
    let tup2 = ("Jiseok Son", 24, "A+");
    let (name, age, score) = tup2; // destruct
    println!("Name: {name}, age: {age}, score: {score}");

    let arr1: [i32; 5] = [1, 2, 3, 4, 5]; // i32 5개의 리스트 타입
    let arr2 = [1; 5]; // [1, 1, 1, 1, 1]
    let first_of_arr1 = arr1[0];
}

3. Functions

fn main() {
    my_function(12);
    let x = add_one(1);
    println!("x + 1 is: {x}");
}

fn my_function(x: i32) {
    println!("The value of x: {x}");
}

fn add_one(x: i32) -> i32 {
    x + 1
}
The value of x: 12
x + 1 is: 2

Statement와 expression의 차이

rust의 함수 몸체는 statement의 나열과 선택적인 마지막 expression으로 구성된다.

fn do_something(x: i32) -> i32 {
    println!("do something here...");
    let y = x * 2;
    y
}

다른 언어와 달리 rust는 statement와 expression의 차이가 존재한다.

  • Statement는 동작을 한 후 값을 반환하지 않는다.
  • Expression은 평가된 값을 반환한다.

{}으로 생성되는 block 전체도 expression이므로 다음과 같은 구현이 가능하다.

let x = {
	let y = x * 2;
    y
};

3. Comments

// this is rust comment!

4. Control Flow

if expression

fn main() {
    let score = 24;

    if age < 50 {
        println!("Too low");
    } else if age <= 100{
        println!("Qualified!");
    } else {
        println!("Excellent!");
    }
}

if문도 expression이므로 반환되는 값을 이용해 다음과 같은 구현도 가능하다.

let pass = if score >= 80 { true } else { false };

Repetition with loop

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

loop 역시 expression이며 break를 이용해 지정한 값을 반환할 수 있다.

let mut x = 1;
let y = loop {
    if x >= 100 {
        break x;
    }
    x = x * 2;
};

loop label

loop에 라벨을 지정해, 탈출하고자 하는 loop를 지정할 수 있다. 이를 이용해 중첩된 loop의 가장 안쪽에서 가장 바깥 loop를 탈출할 수 있다.

fn main {
    'outer: loop {
        'inner: loop {
            break 'outer;
        }
    }
}

Conditional loop

while i < 10 {
	...
}

Looping through collection with for

for element in arr {
	...
}
profile
make it work make it right make it fast

0개의 댓글