3.3. 함수
함수
함수는 fn 키워드를 사용한다.
러스트에서는 함수를 선언만 하면 메인의 위아래 상관없이 실행 가능하다.
매개변수를 만들 때는 타입을 명시해준다.
이는 함수가 변수를 사용할 때 타입을 추론하지 않아도 된다는 설계 아래 의도된 바이다.
구문과 표현식
러스트에서는 구문과 표현식을 구분하는 것이 중요하다.
- 구문 - 어떤 동작을 수행하고 값을 반환하지 않는 명령
- 표현식 - 결과값 평가
let y = 6;
이런 건 평범한 구문이다.
c언어는 구문이 반환값이 존재하는데 러스트는 그렇지 않다.
반면 표현식은 결과가 존재한다.
5+6
이것은 11이라는 결과값이 존재하는 표현식이다.
표현식은 당연히 구문의 일부일 수 있다.
함수 호출, 매크로 호출, 중괄호로 쌓인 블록도 표현식이다.
{
let x = 3;
x + 1
}
놀랍게도 이것도 표현식이다.
잘 보면 마지막 줄은 세미콜론을 넣지 않았다.
세미콜론을 넣는 순간 표현식은 구문으로 변경되고, 값이 반환되지 않는다.
이런 식의 코드는 문제 없다는 것이다.
반환값을 가진 함수
당연히 함수는 리턴할 수 있다.
반환값이 명명될 필요는 없지만, 타입은 명시되어야 한다.
반환값은 마지막 표현식이다.
물론 return을 통해 반환하는 것도 가능하다.
fn five() -> i32 {
5
}
fn main() {
let x = five();
println!("The value of x is: {x}");
}
놀랍게도 이런 코드가 성립한다는 것이다.
만약 five 함수에 세미콜론이 붙었다면, 해당 코드는 구문이 되고 함수는 유닛, 즉 ()을 반환했을 것이다.
그렇다면 x는 아무것도 받지 못했다고 판단되며 에러가 나게 된다.
이런 에러에 대해서도 컴파일러는 세미콜론을 제거하라고 친절하게 충고해준다.