📌 "The Rust Programming Language"를 읽고 남긴 기록
변수, 타입, 함수, 제어 흐름 등 대부분의 프로그래밍 언어에서 다루는 개념이 rust에서는 어떻게 동작하는지 알아보자.
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}");
}
// 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을 통해 불필요하게 새로운 변수 이름을 정하지 않아도 된다.
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];
}
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
rust의 함수 몸체는 statement의 나열과 선택적인 마지막 expression으로 구성된다.
fn do_something(x: i32) -> i32 {
println!("do something here...");
let y = x * 2;
y
}
다른 언어와 달리 rust는 statement와 expression의 차이가 존재한다.
{}으로 생성되는 block 전체도 expression이므로 다음과 같은 구현이 가능하다.
let x = {
let y = x * 2;
y
};
// this is rust comment!
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 };
fn main() {
loop {
println!("Hello");
}
}
loop 역시 expression이며 break를 이용해 지정한 값을 반환할 수 있다.
let mut x = 1;
let y = loop {
if x >= 100 {
break x;
}
x = x * 2;
};
loop에 라벨을 지정해, 탈출하고자 하는 loop를 지정할 수 있다. 이를 이용해 중첩된 loop의 가장 안쪽에서 가장 바깥 loop를 탈출할 수 있다.
fn main {
'outer: loop {
'inner: loop {
break 'outer;
}
}
}
while i < 10 {
...
}
for element in arr {
...
}