함수
fn main() { print_fizzbuzz_to(20);}
fn is_divisible(n: u32, divisor: u32) -> bool { if divisor == 0 { return false; } n % divisor == 0}
fn fizzbuzz(n: u32) -> String { let fizz = if is_divisible(n, 3) { "fizz" } else { "" }; let buzz = if is_divisible(n, 5) { "buzz" } else { "" }; if fizz.is_empty() && buzz.is_empty() { return format!("{n}"); } format!("{fizz}{buzz}")}
fn print_fizzbuzz_to(n: u32) { for i in 1..=n { println!("{}", fizzbuzz(i)); }}
- 반환값이 없는 함수의 경우, 유닛 타입
()
을 반환한다.-> ()
가 생략된 경우 컴파일러는 이를 추론한다. fizzbuzz_to()
함수 내 for 반목문의 범위 표현식 중=n
은 n까지 포함한다는 의미이다.
메서드
struct Rectangle { width: u32, height: u32,}
impl Rectangle { fn area(&self) -> u32 { self.width * self.height }
fn inc_width(&mut self, delta: u32) { self.width += delta; }}
-
메서드는 특정 타입과 연결된 함수이다.
-
메서드의 self 인자가 그 메서드가 연결된 인스턴스의 타입이다.
-
Rust에서는 기술적으로 커스텀 생성자를 직접 지원하지는 않는다. (참고)
-
오버로딩은 지원되지 않는다.
-
파라미터의 기본 값이 지원되지 않는다. 이런 사항들이 제약이 될 경우, 대안으로 매크로를 사용하기도 한다.
-
하지만, 함수의 매개변수에 제네릭을 적용할 수 있다.
fn pick_one<T>(a: T, b: T) -> T {if std::process::id() % 2 == 0 { a } else { b }}fn main() {println!("coin toss: {}", pick_one("heads", "tails"));println!("cash prize: {}", pick_one(500, 1000));}
참고