반환 타입

반환 타입 (Return types)

메서드의 반환 타입은 항상 컴파일러가 추론해요. 그래도 두 가지 이유 때문에 직접 지정하고 싶을 수 있어요:

  1. 메서드가 원하는 타입을 반환하는지 확실히 하기 위해
  2. 문서 주석에 나타나게 하기 위해

예를 들어:

def some_method : String
  "hello"
end

반환 타입은 type grammar를 따릅니다.

Nil 반환 타입 (Nil return type)

메서드가 Nil을 반환한다고 표시하면, 실제로 무엇을 반환하든 nil을 반환하게 돼요:

def some_method : Nil
  1 + 2
end

some_method # => nil

이것은 두 가지 이유로 유용해요:

  1. 끝이나 모든 반환 지점에 nil을 추가하지 않아도 메서드가 nil을 반환한다는 것을 확실히 하기 위해
  2. 메서드의 반환 값에 관심이 없다는 것을 문서화하기 위해

이런 메서드는 보통 부수 효과(side effect)를 암시해요.

Void를 쓰는 것도 같지만, Nil이 더 관용적이에요. Void는 C 바인딩에서 선호돼요.

NoReturn 반환 타입 (NoReturn return type)

어떤 표현식은 현재 스코프로 반환되지 않아서 반환 타입이 없어요. 이것은 특별한 반환 타입 NoReturn으로 표현돼요.

반환하지 않는 메서드와 키워드의 대표적인 예는 return, exit, raise, next, break예요.

이것은 예를 들어 유니온 타입을 분해할 때 유용해요:

string = STDIN.gets
typeof(string)                        # => String?
typeof(raise "Empty input")           # => NoReturn
typeof(string || raise "Empty input") # => String

컴파일러는 stringNil인 경우 string || raise 표현식의 오른쪽이 평가된다는 것을 알아차려요. typeof(raise "Empty input")NoReturn이므로 그 경우 실행이 현재 스코프로 돌아오지 않아요. 그래서 남는 결과 타입은 String뿐이에요.

모든 코드 경로가 NoReturn으로 끝나는 모든 표현식은 NoReturn이에요. NoReturn은 유니온 타입에 나타나지 않아요. 모든 표현식의 타입에 사실상 포함되기 때문이에요. 현재 스코프로 절대 돌아오지 않는 표현식에서만 쓰여요.

NoReturn은 메서드나 함수 정의의 반환 타입으로 명시적으로 설정할 수 있지만, 보통은 컴파일러가 추론해요.

출처: Crystal 공식 문서

더 알아보기 (Learn more)

  • 타입 표기법은 type grammar 문서를 확인해 보세요.