Webエンジニアのメモ帳

技術的な話を中心に書いています。

【Kotlin】拡張関数で自身を参照する方法 (レシーバ付き関数リテラル)

Kotlinには拡張関数という仕組みがあり、既存のクラスにメソッドを追加することが可能です。

例えば以下コードでは、Int型にsum()メソッドを追加しています。

fun Int.sum(num: Int): Int {
  return this + num
}

その結果、以下のような記述が可能になります。

val answer = 1.sum(2)
println(answer)
// 3が出力される

このような関数の書き方を「関数リテラル」と言い、関数の中で記述される「this」をレシーバと言います。(例でいう1)

なお最初のコードは、以下のように記述することも可能です。

val sum: Int.(Int) -> Int = fun Int.(num): Int {
  return this + num
}

:の後のInt.(Int) -> Intは関数の引数と返り値の型で、()内のIntは引数であるnumの型を、->の後のIntは返り値の型を表しています。