프로그래밍 언어/[Rust]

[Rust] Expression

swc0317 2025. 1. 7. 22:56
728x90
반응형
Expression

 

Rust를 포함하고, 여러 프로그래밍 언어의 소스코드는 여러 구문으로 

 

구성되어있습니다. 예를 들어, C++의 swap 연산은 아래와 같습니다.

 

#include <iostream>

// 템플릿을 사용한 swap 함수
template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

 

그리고 rust의 swap은 다음과 같습니다.

 

fn swap<T>(a: &mut T, b: &mut T) {
    let temp = std::mem::replace(a, std::mem::replace(b, std::mem::take(a)));
}

 

이렇게 각 구문들은 여러 variable이 연산자로 인해

 

연산되는 expression, 즉 표현식으로 구성되어있습니다.

 

fn main() {
    // variable binding
    let x = 5;

    // expression;
    x;
    x + 1;
    15;
}

 

Rust의 Block 또한 expression 이다.

 

C++에선 함수에서 return을 통해 해당 함수에서 return 하는 값을 명시합니다.

 

fn main() {
    let x = 5u32;

    let y = {
        let x_squared = x * x;
        let x_cube = x_squared * x;

        // This expression will be assigned to `y`
        x_cube + x_squared + x
    };

    let z = {
        // The semicolon suppresses this expression and `()` is assigned to `z`
        2 * x;
    };

    println!("x is {:?}", x);
    println!("y is {:?}", y);
    println!("z is {:?}", z);
}

 

Rust의 경우, 식별자에 할당하는 값조차 block으로 활용할 수 있습니다.

 

그런데, return이 없습니다. 이 블럭의 표현식들 중 뭘 return 하는 걸까요?

 

정답은 마지막 세미콜론이 없는 표현식입니다.

 

특히, 반드시 세미콜론이 없어야합니다. 모든 구문이 세미콜론을

 

포함하면 return 값은 (), unit type, 즉 void 입니다.

 

fn main() {
    let x = {
        let y = 3;
        y + 1 // 세미콜론이 없으므로 4가 반환됩니다.
    };
      let z = {
        let a = 3;
        a + 1; // 세미콜론이 있으므로 ()가 반환됩니다.
    };
 }

 

그러면, 세미콜론이 없는 구문의 표현식의 평가된 값만 return 한다면?

 

나머지 세미콜론이 있는 구문들은 뭘 하느냐?

 

그냥 평가합니다. 순서대로 모든 구문들을 평가한 뒤,

 

마지막으로 세미콜론이 없는 구문을 평가하고, 해당 값을 return하는 겁니다.

 

racket으로 치면 begin 함수와 유사합니다.

 

3.15 Sequencing: begin, begin0, and begin-for-syntax

Sequencing in The Racket Guide introduces begin and begin0. The first form applies when begin appears at the top level, at module level, or in an internal-definition position. In that case, the begin form is equivalent to splicing the forms into the enclos

docs.racket-lang.org

 

Rust의 block을 통해, 

 

단일 표현식에서 여러 값들을 평가한 뒤 원하는 값을

 

return할 수 있습니다.

728x90
반응형

'프로그래밍 언어 > [Rust]' 카테고리의 다른 글

[Rust] Closures  (0) 2025.02.09
[Rust] Rust Functions  (0) 2025.02.09
[Rust] Type Conversion  (0) 2025.01.07
[Rust] Types  (1) 2025.01.03
[Rust] Variable의 특성  (0) 2024.12.30