Kotlin KoansでKotlin入門 第18回:Invoke


はじめに

公式の問題集「Kotlin Koans」を解きながらKotlinを学習します。

過去記事はこちら

問題

Invoke

invoke()メソッドを持つオブジェクトは、関数として呼び出すことができます。
どのクラスでも invoke 拡張を追加することができますが、使いすぎないようにしたほうがよいでしょう。

operator fun Int.invoke() { println(this) }

1() //huh?..

Invokable.invoke()という関数を実装して、呼び出された回数をカウントするようにしましょう。

修正前のコード

class Invokable {
    var numberOfInvocations: Int = 0
        private set

    operator fun invoke(): Invokable {
        TODO()
    }
}

fun invokeTwice(invokable: Invokable) = invokable()()

問題のポイント

operator overloadingのつづきでinvoke operatorを使います。
括弧だけでinvokeメソッドを呼び出すことができます。

解答例

class Invokable {
    var numberOfInvocations: Int = 0
        private set

    operator fun invoke(): Invokable {
        numberOfInvocations += 1
        return this
    }
}

fun invokeTwice(invokable: Invokable) = invokable()()