E208: Extension Has Default Receiver

E208: Extension Has Default Receiver

이 경고는 확장 메서드가 리시버(receiver) 파라미터에 기본 인자를 가질 때 발생해요. 확장 메서드가 객체에 대한 선택으로 호출될 때 기본값은 절대 사용되지 않기 때문에 권장되지 않아요.

출처: Scala 3 Reference

본문

확장 메서드는 일반적으로 receiver.method()처럼 호출되는데, 이때 리시버는 항상 제공돼요. 리시버의 기본 인자는 메서드를 일반 함수로 호출할 때만 의미가 있어요. 그런 경우라면 애초에 확장으로 정의하면 안 되겠죠.

예시 (Example)

extension (s: String = "hello, world") def invert = s.reverse.toUpperCase

에러 (Error)

-- [E208] Potential Issue Warning: example.scala:1:23 --------------------------
1 |extension (s: String = "hello, world") def invert = s.reverse.toUpperCase
  |                       ^
  |Extension method invert should not have a default argument for its receiver.
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | The receiver cannot be omitted when an extension method is invoked as a selection.
  | A default argument for that parameter would never be used in that case.
  | An extension method can be invoked as a regular method, but if that is the intended usage,
  | it should not be defined as an extension.
   -----------------------------------------------------------------------------

설명 (Explanation)

확장 메서드가 선택으로 호출될 때 리시버는 생략될 수 없어요. 그 경우 해당 파라미터의 기본 인자는 절대 사용되지 않아요. 확장 메서드는 일반 메서드로 호출될 수도 있지만, 그것이 의도된 용법이라면 확장으로 정의하면 안 돼요.

해결 방법 (Solution)

리시버 파라미터에서 기본 인자를 제거해요.

extension (s: String) def invert = s.reverse.toUpperCase

기본 인자가 있는 함수가 필요하다면 확장 대신 일반 메서드로 정의해요.

def invert(s: String = "hello, world"): String = s.reverse.toUpperCase

참고로 확장 메서드에서는 리시버가 아닌 파라미터에 기본 인자를 허용해요.

extension (s: String)
  def combine(other: String = ", world") = s + other