STUDY/Rust

Rust - 5. 문법/함수, 주석, 제어흐름문

sinawi95 2024. 2. 15. 22:17
728x90

1. 함수

fn func_name(param_name: param_type) -> ret_type {
    // code
}
  • fn 키워드를 사용한다.
  • 매개변수를 사용할수 있다.

c와 다르게 함수의 위치를 고려하지 않아도 된다.

  • header등에 미리 써넣지 않아도 된다. 파이썬도 함수 선언 순서 상관 없었던것 같다.

2. 표현식, 구문

차이는 명확한데 설명하는게 좀 어렵다.

  • c 기준으로 값으로 사용할수 있으면 표현식이고 값으로 사용할수 없어도 실행이 되면 구문이라고 배웠던거같은데.
  • 러스트도 비슷하긴한데 조금 다르다. 세미콜론이 붙으면 구문, 붙이지 않아도 사용할 수 있으면 표현식.(제대로된 설명이 맞는진 모르겠다.?) 
    • 표현식은 결과 값을 평가하고 반환함
    • 구문은 동작을 수행하고 값을 반환하지 않음

아래에서 예시를 보자.

let y = 6;

let y = {
    let x = 3;
    x + 1
};
  • 여기서 표현식은 6과 { let x= 3; x+1} 이고 구문은 let y = 6; let y = {~}; 이다
    • 표현식 6은 그 자체로 사용할수 있다.
    • 표현식 { let x= 3; x+1 } 은 블록 내 구문이 있지만 반환값(코드 블록 마지막에 세미콜론이 없으면 반환값이다)이 있으므로 표현식이 된다. (이게 다른 언어랑 다르다)

 

3. 주석

// comment

/* comments */

c와 같다. 끝

  • doc 을 위한 comment 사용법도 있는데 그건 나중에 사용하게되면 볼 것이다.

 

4. 제어 흐름문

조건문 if

if condition1 {
	// code1
} else if condition2 {
	// code2
} else {
	// code3
}
  • condition에 들어가는 값은 무조건 boolean(true, false)이어야 한다. 0, 1, 2 등과 같이 정수가 들어가면 에러가 발생한다.
  • if 값은 표현식으로 쓸 수 있다.
    • if 블록, else if 블록, else 블록 등에 반환 값을 넣어준다면 우변에 넣어서 사용할수 있다.(반환 타입은 다 같아야 에러가 나지 않는다)

반복문 loop

  • break 뒤에 위치한 값을 반환시킬수 있음
  • 라벨(loop 앞에 작은따옴표로 시작)을 사용할수 있음. break으로 라벨이 붙은 loop를 멈출수 있음(break 뒤에 라벨 이름 작성)
    • break 뒤에 label이랑 return value 모두 작성해도 되나? 순서가 있겠지?

반복문 while

  • loop + if + break

반복문 for

  • 배열과 같은 컬렉션의 요소 순회(인덱스를 변수로 사용하지 않아서 안정성 높임)

5. 연습

화씨 온도와 섭씨 온도 간 변환하기 

fn main() {
    println!("0F = {:.2}C", ftoc(0.0));
    println!("100C = {}F", ctof(100.0));
}


fn ftoc(fahrenheit: f32) -> f32 {
    let celsius = (fahrenheit - 32.0) * 5.0 / 9.0;

    celsius
}
fn ctof(celsius: f32) -> f32 {
    celsius * 1.8 + 32.0
}
  • 입력받는건 귀찮아서 하지 않았다.
  • float로 연산을 하려면 모든 피연산자들도 다 float가 되어야한다. (celsius * 1.8 + 32) 도 에러가 발생한다.

n번째 피보나치 수 생성하기

fn main() {
    println!("fibo(10) = {}", fibonacci(10));
}

fn fibonacci(n: u32) -> u32{
    if n == 0 || n == 1 {
        return n
    }
    fibonacci(n-2) + fibonacci(n-1)
}
  • 재귀함수로 만들었다. dp를 쓰려면 벡터를 배워야하니 패스.

 

크리스마스 캐롤 ‘The Twelve Days of Christmas’ 노래의 반복성을 활용하여 가사 출력해보기

fn main() {
    print_lylics();
}

fn print_lylics() {
    let ordinals = ["", "first", "second","third", "fourth","fifth", "sixth", "seventh","eighth","ninth", "tenth", "eleventh","twelfth"];
    let gifts = [
        "",
        "A partridge in a pear tree.",
        "Two turtle doves, And",
        "Three French hens,",
        "Four calling birds,",
        "Five gold rings,",
        "Six geese a-laying,",
        "Seven swans a-swimming,",
        "Eight maids a-milking,",
        "Nine ladies dancing,",
        "Ten lords a-leaping,",
        "Eleven pipers piping,",
        "Twelve drummers drumming,",
    ];
    
    for num in 1..=12 {
        println!("On the {} day of Christmas,\nMy true love sent to me", ordinals[num]);
        let temp_gifts = &gifts[..(num+1)];
        for gift in temp_gifts.iter().rev() {
            println!("{}",gift);
        }
    }

}
  • 처음 들어보는 캐롤이다.
  • 배열과 for를 사용해서 만들었다. 0번째 인덱스는 1~12에 맞게 빈칸으로 만들어놓았는데 한줄 띄우기 용도가 생겨버렸다.
  • 배열 슬라이싱과 iter(), rev()을 사용해봤다. (이터레이터 만들기, 이터레이터 반대방향으로 순회하기)
  • &는 소유권 관련이라는데 다음장을 빨리 넘어가야겠다.

https://doc.rust-kr.org/ch03-03-how-functions-work.html

https://doc.rust-kr.org/ch03-04-comments.html

https://doc.rust-kr.org/ch03-05-control-flow.html

 

'STUDY > Rust' 카테고리의 다른 글

Rust - 7. 구조체, 열거형, 패턴 매칭  (1) 2024.02.17
Rust - 6. 소유권  (0) 2024.02.16
Rust - 4. 문법/변수, 데이터 타입  (0) 2024.02.14
Rust - 3. 추리게임 만들기 (with python)  (0) 2024.02.14
Rust - 2. 프로젝트 생성  (0) 2024.02.13