Kotlin1.6.20からContext Receiversという機能がプロトタイプ版として使えるようになりました。
https://blog.jetbrains.com/kotlin/2022/02/kotlin-1-6-20-m1-released/
Kotlinは言語仕様的に成熟しており、言語仕様の追加は珍しかったので、キャッチアップがてら触ってみました。雑なメモ記事です。
試し方
上に添付したリリース記事に記載されているとおり、コンパイラオプションとして -Xcontext-receivers
を追加した上で起動すれば大丈夫です。
ちなみにgradleを使っている場合は以下のように書けば動きます。(gradleをKotlinで書いている場合の例です)
tasks.withType<KotlinCompile> {
kotlinOptions.freeCompilerArgs = listOf("-Xcontext-receivers")
}
サンプルコード
以下のようなコードで動きます。
context receiversがまだプロトタイプ版のためIntelliJ上ではエラーになるかもしれませんが、実行すれば動きます。
data class LoginContext(
val userId: Long,
val userName: String,
val email: String
)
fun main(args: Array<String>) {
val ctx = LoginContext(1L, "Tom", "tom@example.com")
handleRequest(ctx)
}
fun handleRequest(ctx: LoginContext) {
with(ctx) {
doSomeOperation()
}
}
context(LoginContext)
fun doSomeOperation() {
println("user [id = ${userId}] do some operation!")
}
Scalaのimplicit parameterに似ているなと感じます(Scalaを使ったのが大分昔なので、間違っていたらすみません)。
ログインユーザの認証情報(基本情報)、権限情報、DBのコネクション情報など、引数として引き回したいものがあるときに、活用できそうな機能なので、本実装としてリリースされるのが楽しみです。
他のユースケースについては、KEEP(Kotlinの言語仕様のDiscussionが行われている場所)にいろいろ書かれているようなので、参考として貼っておきます。
https://github.com/Kotlin/KEEP/blob/master/proposals/context-receivers.md#use-cases