연산자 오버로드를 할 때는 의미에 맞게 사용하라

연산자 오버로딩은 강력한 기능이지만, 책임이 따른다.

  fun Int.factorial(): Int = (1..this).product()
  fun Iterable<Int>.product(): Int = fold(1) { acc, i -> acc * i }

  operator fun Int.not() = factorial()

not은 논리 연산에 사용해야지, 팩토리얼 연산에 사용하면 안된다.

코틀린에서 각 연산자의 의미는 항상 같게 유지해야 된다.

분명하지 않은 경우

infix를 활용한 확장 함수를 사용하자

  infix fun Int.timesRepeated(operation: ()->Unit)={
      repeat(this) { operation() }
  }

  3 timeRepeated { print("Hello")}

톱 레벨 함수를 사용하자

규칙을 무시해도 되는 경우

DSL를 설계할 때는 연산자 오버로딩 규칙을 무시해도 된다.

body{
  div{
   +"Some text"
  }
}

Last updated