Skip to content

Latest commit

 

History

History
75 lines (61 loc) · 1.97 KB

함수와 메서드.md

File metadata and controls

75 lines (61 loc) · 1.97 KB

함수

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

참고