체인의정석

Rust 기본 프로그래밍 컨셉 (함수) 본문

블록체인/Rust

Rust 기본 프로그래밍 컨셉 (함수)

체인의정석 2023. 1. 16. 12:17
728x90
반응형

기본 함수

기본 함수는 다음과 같이 정의한다.

fn main() {
    another_function(5);
}

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

이런 식으로 정의를 하게 되면

➜ functions (master) ✗ cargo run          
   Compiling functions v0.1.0 (/Users/chohk/Desktop/git/rust/functions)
    Finished dev [unoptimized + debuginfo] target(s) in 0.84s
     Running `target/debug/functions`
The value of x is: 5

이런 결과가 나오게 된다.

 

여러 변수의 정의는 그냥 일반적인 함수와 똑같이 , 를 넣어주면 된다.

Statements와 Expression

러스트는 expression 기반 언어이기 때문에 exrpession을 잘 이해해야 한다.

statement 는 지시로서 값을 리턴하지 않는 행동을 의미한다.

exrpession은 결과 값을 평가하게 된다.

 

let 키워드는 statement이다.

fn main() {
    let y = 6;
}

함수에 대한 정의 또한 statement이다.

fn main() {
    let x = (let y = 6);
}

이러한 선언에 해당하는 부분은 그냥 값을 리턴해주지 않고 선언만 해주는 부분이다.

let y = 6;

위의 값은 statement이다. 값에 대한 리턴이 없으므로 위의 코드를 실행 할 시에 에러가 나게 된다.

이러한 문법은 다른 C나 ruby와 같은 언어와는 다르게 x = y= 6이라고 하면 둘다 6의 값을 가질 수 없게 된다.

 

5 + 6 과 같은 부분이 expression이다. expression안에는 statements 개념이 포함된다. let y =6에서 6은 statemenet이고

let y =6은 값 6에 대한 평가를 하는 expression이다. 또한 함수를 부르는 부분또한 exrpession이며 macro를 부르는 부분 또한 expression이다. 새로운 대괄호를 여는 부분또한 expression이다.

 

아래에서 대괄호 안의 부분이 expression이다.

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

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

여기서 x+1 라인에는 ; 이 들어가 있지 않는데 expression에는 세미콜론을 포함하지 않는다.

만약 exrpession 뒤에 ;를 넣게 되면 statement로 바뀌게 된다. 그러면 결국 값을 리턴하지 않게 된다.

따라서 함수는 값을 먼저 리턴하고 그 다음에 statement를 정의한다는 점을 명심해야 한다.

 

리턴값이 있는 함수

리턴 값의 경우 화살표로 표현한다. 리턴 값들을 이름붙이는 대신 화살표를 사용하며 러스트에서 리턴 값은 함수의 body에서 마지막 exrpession과 같은 값을 의미한다.

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

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

세미콜론이 없는 5가 마지막 statement  이므로 여기서는 5가 리턴되는 것이다.

 

let x = five()의 경우 값을 리턴해 준다는 것을 보여주게 된다.

let x = 5; 와 같은 부분이다.

두번째로 five 함수는 입력값 없이 리턴 값만 정의해주고 있다. 하지만 실제 body는 세미콜론이 없는 5 하나뿐이다.

 

 

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

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

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

이런식으로 사용해 준다면 값이 나오지만

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

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

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

이렇게 세미콜론을 빼면 expression이 아닌 statement가 되므로 에러가 발생하게 된다.

728x90
반응형
Comments