If문
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
number가 5보다 작으면 "condition was true", 아니라면 "condition was false"문을 출력한다.
if표현식은 arms라고 불리기도 한다.
Rust는 boolean이 아닌 타입을 자동으로 boolean으로 변환하지 않는다.
fn main() {
let number = 3;
if number {
println!("number was three");
}
}
위 코드는 다음과 같은 에러가 발생한다.
따라서 if문은 다음과 같이 항상 명시적으로 조건을 제시해야 한다.
fn main() {
let number = 3;
if number != 0 {
println!("number was something other than zero");
}
}
다음과 같이 let 구문에 if표현식을 넣는 것도 가능하다. 하지만 다음은 오류가 발생한다.
fn main() {
let condition = true;
let number = if condition { 5 } else { "six" };
println!("The value of number is: {}", number);
}
if식과 else식의 타입이 달라서 발생하는 오류이다. 변수는 항상 단일 타입을 가져야 한다.
Else if문
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
Loop문
fn main() {
loop {
println!("again!");
}
}
이렇게 브레이크가 없이 계속 돌아가는 loop문은 Ctrl+C와 같은 수동 제어하는 수 밖에 없다.
break문이나 continue문으로 loop문을 제어할 수도 있다.
fn main() {
let mut count = 0;
'counting_up: loop {
println!("count = {}", count);
let mut remaining = 10;
loop {
println!("remaining = {}", remaining);
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("End count = {}", count);
}
loop문의 라벨(label) 'counting_up을 붙일 수 도 있다. 위 예제 처럼 내부 loop와 외부 loop를 사용하여 프로그램을 작성할 수 있다.
위의 코드 결과는 이렇다.
loop문으로 스레드가 작업을 완료했는지 여부와 실패할 수 있는 작업의 재시도가 가능하다.
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
counter의 값이 1씩 증가하여 10이 되면 counter * 2의 값을 result에 할당한다.
그런데 break counter * 2; 의 구문에서 표현식의 관점으로 변경하여 세미콜론(;)을 제거해도 코드가 실행되었다.
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2
}
};
println!("The result is {}", result);
}
While문
조건이 참인 동안 루프가 실행된다. 조건이 참이 되지 않으면 프로그램은 break를 호출하여 루프를 중지한다.
fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
while index < 5 {
println!("the value is: {}", a[index]);
index += 1;
}
}
그런데, 위의 코드는 불안정하고 컴파일러가 루프를 돌 동안 인덱스가 배열 범위 안에 있는지를 검사하기 위해 런타임 코드를 추가하기 때문에 속도가 느리다.
다음과 같은 간결한 코드 사용을 권장한다.
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {}", element);
}
}
범위를 반전시키려면 rev를 사용한다.
fn main() {
for number in (1..4).rev() {
println!("{}!", number);
}
println!("LIFTOFF!!!");
}
- 화씨와 섭씨 사이의 온도를 변환합니다.
- n번째 피보나치 수를 생성합니다.
- 노래의 반복을 활용하여 크리스마스 캐롤 “Twelve Days of Christmas”의 가사를 인쇄합니다.
이걸 해보자.
- 화씨(m)와 섭씨(n)의 차이 공식 : (n°C × 9/5) + 32 = m°F
1트 결과
float타입과 integer타입의 연산이 구현되지 않아 에러가 났다.
2트 결과
성공
use std::io;
fn main() {
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
let celsius: f64 = input.trim().parse().expect("Failed to parse");
let fahrenheit = (celsius * 1.8) + 32f64;
println!("{}F", fahrenheit);
}
- n번째 피보나치 수를 생성합니다.
피보나치 수란 ? 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열
1트 결과
함수의 리턴 타입을 넣지 않아 에러가 발생했다.
2트 결과
성공
use std::io;
fn main() {
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
let fiboo: u64 = input.trim().parse().expect("Failed to parse");
println!("fibo({}) = {}", fiboo, fibo(fiboo));
}
fn fibo(n: u64) -> u64 {
if n == 1 || n == 2 {
return 1;
}
return fibo(n-1) + fibo(n-2)
}
- 노래의 반복을 활용하여 크리스마스 캐롤 “Twelve Days of Christmas”의 가사를 인쇄합니다.
노래 가사가 A(1)1~, A(2)2~1~, A(3)3~2~1~로 반복된다.
// X
fn main() {
for number in (3..0) {
println!("{}", number);
}
}
// O
fn main() {
for number in (0..3).rev() {
println!("{}", number);
}
}
거꾸로 값을 출력하려면 3..0은 안되었다.
fn main() {
let arr = ["1", "2", "3"];
for number in arr.into_iter().rev() {
println!("{}", number);
}
}
배열(array)는 바로 rev()할 수 없고 into_iter()로 배열을 iterator로 바꾸어서 rev()함수를 사용했다.
fn main() {
let numbers = ["first", "second", "third", "fourth", "fifth", "sixth",
"seventh", "eighth", "ninth", "tenth", "11th", "12th"];
let mut lyrics2 = [
"",
"Two turtle-doves",
"Three French hens",
"Four calling birds",
"Five golden rings (five golden rings)",
"Six geese a laying",
"Seven swans a swimming",
"Eight maids a milking",
"Nine ladies dancing",
"Ten lords a-leaping",
"I sent 11 pipers piping",
"12 drummers drumming",
];
for i in 0..12 {
println!("On the {} day of Christmas\nMy true love sent to me", numbers[i]);
for j in (1..i+1).rev() {
println!("{}", lyrics2[j]);
}
let end = if i == 0 {
"A"
} else {
"And a"
};
println!("{} partridge in a pear tree", end);
if i == 11 {
println!("{} partridge in a pear tree", end);
}
println!();
}
}
range x..y는 x이상 y미만이라는 것에 유의하자.
출력은 앞을 생략하고 마지막 부분만 캡쳐했다.