오버로드 모호성 해소

오버로드 모호성 해소

루틴을 호출할 때는 "오버로드 해석(overload resolution)"이 적용된다는 걸 알고 계실 텐데요. 여기서는 그보다 약한 형태인 **오버로드 모호성 해소(overload disambiguation)**를 살펴볼게요. 오버로드된 기호가, 주변에 추가 타입 정보가 갖춰진 어떤 문맥에서 쓰일 때 이 해소가 이루어집니다. p가 오버로드된 기호라고 할 때, 그런 문맥은 크게 세 가지예요.

  • 함수 호출 q(..., p, ...)에서, q의 해당 형식 매개변수(formal parameter)가 proc 타입일 때. q 자체도 오버로드되어 있다면 qp의 모든 해석(interpretation)을 묶은 **데카르트 곱(cartesian product)**을 전부 고려해야 해요.
  • 객체 생성자 Obj(..., field: p, ...)에서 fieldproc 타입일 때. 배열·집합·튜플 생성자에도 이와 비슷한 규칙이 적용됩니다.
  • 선언 x: T = p에서 Tproc 타입일 때.

평소와 마찬가지로, 일치가 모호하면(ambiguous) 컴파일 타임 오류가 나요.

출처: Nim Manual

본문

명명된 인자 오버로딩 (Named argument overloading)

타입 시그니처가 같은 루틴이라도, 매개변수 이름이 서로 다르면 이름을 지정해 개별적으로 호출할 수 있어요.

proc foo(x: int) =
  echo "Using x: ", x
proc foo(y: int) =
  echo "Using y: ", y

foo(x = 2) # Using x: 2
foo(y = 2) # Using y: 2

위처럼 xy라는 서로 다른 매개변수 이름 덕분에 foo를 두 가지로 나눠 부를 수 있죠. 하지만 이런 상황에서 매개변수 이름을 지정하지 않으면 어느걸 호출할지 정할 수 없어서 모호성 오류가 발생합니다.

더 알아보기 (Learn more)

  • 오버로드 해석과 관련해 더 깊게 보려면 Overload resolution 섹션을 참고하세요.
  • 명명된 인자 호출 전반은 Nim Manual의 해당 규칙을 참고하세요.