Skip to content

함수와 메서드

함수

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));
    }

참고