fn main(){
let x = 5;
let y = {
let x = 3;
x+1 // x+1; 이되면 statement로 해석된다.
};
println!("The value of y is : {} ", y);
}
출력 결과를 보면 y는 4가 나온다. 기존에 알고있던 언어들 C, C++, JAVA, Python 과는 다른 양상이다.
x+1; 처럼 사용하면 Statement로 간주되어 값을 반환하지 않는다.
fn five() -> i32{
5
}
fn main(){
let x = five();
println!("x is : {}", x);
}
five 함수를 보면 ->를 통해 반환 타입을 설정해주고 있다. int 32bit 를 반환하는데 반환값인 5에는 세미콜론(;)이 없음을 꼭 짚고 넘어가자.
타 문법에서 5를 반환하려면 return 5; 처럼 쓰는걸 그냥 5 로 쓰면 된다.
그럼 만약 내가 x+1 을 반환한다면? return x+1; 처럼 썼으니까 x+1 이라고 하면된다.
내가 만약 세미콜론을 붙인다면 expression 에서 statement로 간주되고 statement는 반환값이 없으니까 에러가난다.
fn main(){
let lucky_number = 7 ; // I'm feeling lucky
}
보다
fn main(){
//I'm feeling lucky
let lucky_number = 7;
}
같은 방식을 관용적으로 사용한다.
fn main(){
let number =3;
if number <10 {
println!("true");
}
else{
println!("false");
}
과 같다.
C++
int a =3;
if(a){
return;
}
rust
let a =3;
if a {
}
이런 코드는 컴파일 에러를 발생시킨다. 왜냐면 if문의 참 거짓 판별 자리에는 Boolean 식이 와야하는데 int 타입이 왔다.
조건 판별자리에 자동으로 boolean 타입 캐스팅을 안해주고, 괄호가 들어가지 않는다는 점을 빼면 기존에 아는 C++ 문법과 동일하다.
if 는 expression이다. 이를 구분하는게 중요하다고 했다. expression은 값을 반환한다.
따라서 다음과 같은 코드가 된다.
fn main(){
let condition = true;
let number = if condition {5} else{6} ; // number 에는 i32 타입 5가 들어간다.
// let number= if condition{5} else{"hello"} 는 안되는 코드이다.
두번째로 if 문에서 true일때는 i32 5를 할당하고 false이면 String "hello"를 할당한다. 근데 rust는 static type language니까 compile time에 number의 type이 정해져야한다.
하지만 위같은 코드가 돌아가려면 runtime에 확인해야하므로 컴파일 에러가난다.
fn main(){
loop{
println!("hello");
}
}
"Hello"가 무한정찍힌다.
fn main(){
let mut counter =0;
let result = loop{
counter+=1;
if counter == 10{
break counter*2;
}
};
println!(" result : {}",reuslt); // result 는 20이다.
}
얘도 구조를 한번 분석해보자.
let result = expression 인건데
expression이 loop이다. 새로운 스코프를 만드는 {} 또한 expression 이므로 반환값이 있어야한다.
loop expression이 어떻게 구성되는가 하니
counter 를 1씩 추가해가다가 10인 순간 counter*2 값을 반환하고 break로 루프를 종료한다.
-너무 많은 코드의 낭비아닌가, 이를 간단히 하기 위해 while문이 있다
fn main(){
let mut number = 3;
while number !=0{
println!("{}", number);
number -=1;
}
}
while condtion {} 식으로 이루어지는데 이 condtion 값이 true 이면 {} 안의 코드가 실행된다.
fn main({
let a = [10, 20, 30, 40, 50];
for element in a.iter(){
println!("{}", element);
}
}
직접인덱스를 지정하는거보다 좋은점은 out of bound같은 기계적 오류나 요소를 빼먹는다던가 하는 휴먼 에러를 발생시키지 않는다는 것이다. 그래서 Rust를 하면 for을 써라 ! Rustacean들은 for을 사랑한다
Range를 사용하는 방법
fn main(){
for number in (1..4).rev(){ // (1..4) = 1, 2, 3 이고
println!{"{}", number}; // range.rev()는 거꾸로 돌리는거니까 3, 2,1 출력
}
}