DataScience
Published 2023. 4. 10. 09:24
Rust 기본 개념 Rust
728x90

변수와 가변성

let으로 불변성 변수 선언

값 변경을 시도하면 에러가 발생 합니다.

fn main() {
    let x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}
error[E0384]: re-assignment of immutable variable `x`
 --> src/main.rs:4:5
  |
2 |     let x = 5;
  |         - first assignment to `x`
3 |     println!("The value of x is: {}", x);
4 |     x = 6;
  |     ^^^^^ re-assignment of immutable variable​

 

mut으로 가변성 변수 선언

값을 변경해도 에러발생 안합니다.

fn main() {
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}
$ cargo run
   Compiling variables v0.1.0 (file:///projects/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30 secs
     Running `target/debug/variables`
The value of x is: 5
The value of x is: 6

 

const로 상수 선언

상수는 불변성이며 오직 상수 표현식만 가능합니다. 함수 리턴값이나 실행 중에 결정되는 값이 설정 될 수 없습니다.

const MAX_POINTS: u32 = 100_000;

 

shadowing

mut과 shadowing의 차이는 값의 유형을 변경 할 수 있다는 점입니다.

let spaces = "   ";
let spaces = spaces.len();

 spaces 변수가 문자열 유형이고 두 번째 spaces 변수는 첫 번째 것과 동일한 이름을 가진 새롭게 정의된 숫자 유형의 변수입니다.

let mut spaces = "   ";
spaces = spaces.len();

하지만 mut으로 선언하면 변수의 유형을 변경할 수 없다는 에러가 발생합니다.

error[E0308]: mismatched types
 --> src/main.rs:3:14
  |
3 |     spaces = spaces.len();
  |              ^^^^^^^^^^^^ expected &str, found usize
  |
  = note: expected type `&str`
             found type `usize`

 

데이터 타입

타입 명시( :u32 )를 하지 않으면 Rust는 에러를 발생합니다.

let guess: u32 = "42".parse().expect("Not a number!");
error[E0282]: type annotations needed
 --> src/main.rs:2:9
  |
2 |     let guess = "42".parse().expect("Not a number!");
  |         ^^^^^
  |         cannot infer type for `_`
  |         consider giving `guess` a type

 

튜플

튜플은 다양한 타입의 숫자를 집합시켜 하나의 복합 타입으로 만듭니다. 튜플 값의 타입이 동일할 필요가 없습니다.

fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}

 

배열

배열의 모든 요소는 모두 같은 타입이여야 합니다.

배열의 끝을 넘어선 요소에 접근하려해도 컴파일 에러는 발생하지 않습니다. 실행결과는 성공적으로 종료되지 못했다고 나옵니다.

fn main() {
    let a = [1, 2, 3, 4, 5];
    let index = 10;

    let element = a[index];

    println!("The value of element is: {}", element);
}
$ cargo run
   Compiling arrays v0.1.0 (file:///projects/arrays)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31 secs
     Running `target/debug/arrays`
thread '<main>' panicked at 'index out of bounds: the len is 5 but the index is
 10', src/main.rs:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.

색인을 사용하여 요소에 접근하려고 하면 Rust는 지정한 색인이 배열 길이보다 작은지 확인합니다. 색인이 길이보다 길면 Rust는 프로그램이 오류와 함께 종료 될 때 Rust가 사용하는 용어인 *패닉(panic)*합니다.

 

함수

 Rust는 함수의 위치를 신경쓰지 않습니다, 어디든 정의만 되어 있으면 됩니다.

fn main() {
    another_function(5, 6);
}

fn another_function(x: i32, y: i32) {
    println!("The value of x is: {}", x);
    println!("The value of y is: {}", y);
}

 

표현식

let x = 5; 은 구문입니다:

함수 정의는 또 하나의 구문입니다. 구문은 값을 반환하지 않습니다. 그러니, let 구문을 사용해서는 다른 변수에 값을 대입(let x = (let y = 6); )할 수 없습니다.

함수를 호출하는 것은 표현식입니다. 새로운 범위를 생성하는데 사용하는 block { let x = 3; x + 1 };은 표현식입니다.

표현식 x + 1 줄의 마지막이 세미콜론으로 끝나지 않습니다. 표현식은 종결을 나타내는 세미콜론을 사용하지 않습니다.

만약 세미콜론을 표현식 마지막에 추가하면, 이는 구문으로 변경되고 반환 값이 아니게 됩니다.

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

 

반환값을 갖는 함수

plus_one 함수의 반환값은 x + 1  이고 반환타입을 i32로 합니다.

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

 

제어문

조건은 반드시 bool이어야 합니다. Rust는 boolean 타입이 아닌 것을 boolean 타입으로 자동 변환하지 않습니다.

fn main() {
    let number = 3;

    if number {
        println!("number was three");
    }
}

 

반복문

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

    for element in a.iter() {
        println!("the value is: {}", element);
    }
}

 

range를 역순하는 rev메소드를 사용하는 카운트다운

fn main() {
    for number in (1..4).rev() {
        println!("{}!", number);
    }
    println!("LIFTOFF!!!");
}
3!
2!
1!
LIFTOFF!!!

'Rust' 카테고리의 다른 글

Tauri 개발  (31) 2023.04.13
Tauri 구조  (135) 2023.04.12
Tauri Project 생성(Sveltekit)  (119) 2023.04.11
TAURI 소개(Electron과 비교) 및 설치  (96) 2023.04.10
Arch Linux(아치리눅스)에 Rust install  (36) 2023.04.09
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!