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하는 겁니다.
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할 수 있습니다.
'프로그래밍 언어 > [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 |