Objects with the invoke() method can be invoked as a function.
You can add an invoke extension for any class, but it's better not to overuse it:
operator fun Int.invoke() { println(this) }
1() //huh?..
Implement the function Invokable.invoke() to count the number of times it is invoked.
class Invokable {
var numberOfInvocations: Int = 0
private set
operator fun invoke(): Invokable {
TODO()
}
}
fun invokeTwice(invokable: Invokable) = invokable()()
class Invokable {
var numberOfInvocations: Int = 0
private set
operator fun invoke(): Invokable {
numberOfInvocations++
return this
}
}
fun invokeTwice(invokable: Invokable) = invokable()()
객체가 함수처럼 호출될 때마다 호출 횟수를 세는 문제이다.
invoke
함수가 호출 될 때마다 numberOfInvocations
변수 값을 증가 시켜야 되기 때문에 값을 1씩 증가시켜주고 객체 자신(this
)을 반환시켜주면 된다.
private set
은 setter 접근자를 private으로 설정하는 것을 의미한다. 즉, 값 읽기만 가능하고 수정할 수 없게 만드는 것이다.