【Kotlin練習問題】invoke()の実装

Kotlin

invoke()とは

invoke()は演算子のオーバーロードで説明した演算子と同じように、演算子の一つという扱いがなされている関数です。どのクラスに対しても実装することができ、instance()のようにインスタンスのあとに()を付けるだけで呼び出すことが可能になります。

instance()はコンパイラにはinstance.invoke()と解釈されます。

もちろん引数をつけたり、戻り値を設定して実装することも可能です。
以下に簡単な実装例を載せておきます。

引数無し、戻り値無しの場合

class HelloWorld {
    operator fun invoke() {
        print("Hello World!")
    }
}
val helloWorld = HelloWorld()
helloWorld()              //"Hello World!"が出力されます。

引数有り、戻り値無しの場合

class HelloName {
    operator fun invoke(name: String){
        print("Hello " + name)
    }
}
val helloName = HelloName()
helloName("Takashi")        //"Hello Takashi"が出力されます。

引数無し、戻り値有りの場合

class InvokeCount {
    var count: Int = 0
    operator fun invoke(): Int {
        count++
        return count
    }
}
val invokeCount = InvokeCount()
print(invokeCount()) // 1
print(invokeCount()) // 2

どのクラスに対しても実装することができますが、乱用するとかえってコードが読みづらくなる可能性があるので注意しましょう。

問題

次のコードにInvokable.invoke()を実装し、呼び出された回数をカウントする機能を追加してください。

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()では戻り値にInvokable型を指定しているので、invoke()を呼び出したインスタンスをそのまま返すようにしています。

()は演算子の一つという扱いですので、invokable()()のように連続で使うこともできます。

動作確認したい場合は以下をKotlin Playgroundで試してみると良いでしょう。

fun main(){    
    class Invokable {
        var numberOfInvocations: Int = 0
        private set

        operator fun invoke(): Invokable {
            numberOfInvocations++
            return this
        }
    }
    fun invokeTwice(invokable: Invokable) = invokable()()
    val invokable = Invokable()
    invokeTwice(invokable)
    invokable()
    print(invokable.numberOfInvocations)
}
答え

 

その他の問題はこちらからどうぞ。

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

created by Rinker
¥2,640 (2021/06/17 22:46:14時点 楽天市場調べ-詳細)

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました