5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kotlinのcontext receivers機能試しに触ってみた

Last updated at Posted at 2022-06-13

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?