Kotlin Academy · レッスン

適切なスコープ関数の選び方:判断ガイド

レシーバー、戻り値の型、意図に基づいて適切なスコープ関数を選択します。

レッスン 4/414 ステップ

「適切なスコープ関数の選び方:判断ガイド」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

5つの関数と2つの軸

Kotlinのスコープ関数は、2つの軸で異なります。レシーバーの参照方法(thisまたはit)と、返り値(レシーバーまたはラムダの結果)です。意図に応じて選択してください。

選択マトリクス

apply:this / レシーバー。also:it / レシーバー。run:this / ラムダ。let:it / ラムダ。with:this / ラムダ(ドットによるレシーバー指定なし)。

apply:設定して返す

ビルダースタイルのチェーンでオブジェクトを設定するには、applyを使用します。

class Config {
    var host: String = ""
    var port: Int = 0
}
fun main() {
    val cfg = Config().apply {
        host = "localhost"
        port = 8080
    }
    println("${cfg.host}:${cfg.port}")
}

also:副作用

レシーバーを次へ渡しながら、ログ出力、検証、または副作用の実行を行うには、alsoを使用します。

fun main() {
    val items = listOf(1, 2, 3, 4)
        .also { println("got ${it.size} items") }
        .filter { it % 2 == 0 }
    println(items)
}

let:変換、スコープ、null安全性

null安全な変換や変数のスコープの限定には、letを使用します。

fun main() {
    val name: String? = "Ada"
    val length = name?.let { it.length } ?: 0
    println(length)
}

run:複数メンバーへのアクセスと結果の取得

レシーバーの複数のメンバーから結果を計算する場合は、runを使用します。it.の接頭辞を省略できます。

class User(val name: String, val age: Int)
fun main() {
    val description = User("Ada", 35).run {
        "Name: $name, Age: $age"
    }
    println(description)
}

with:既存オブジェクトに対する操作のグループ化

呼び出し箇所を変更できず(ドットチェーンを使えず)、thisを使って操作をまとめたい場合は、with(obj) { ... }を使用します。

class Builder {
    val parts = mutableListOf<String>()
    fun add(s: String) { parts.add(s) }
    fun build(): String = parts.joinToString("-")
}
fun main() {
    val b = Builder()
    val result = with(b) {
        add("hello")
        add("kotlin")
        build()
    }
    println(result) // hello-kotlin
}

意図に基づいて選択する

次の点を確認してください。(1)レシーバー自体が必要ですか、それとも派生した結果が必要ですか?(2)thisとitのどちらを使いたいですか?答えによって使用する関数が決まります。

class Box { var w = 0; var h = 0; fun area() = w * h }
fun main() {
    // Configure and return Box -> apply
    val box = Box().apply { w = 3; h = 4 }
    // Compute area from box -> let or run
    val area = box.let { it.area() }
    // Side effect, keep box -> also
    val sameBox = box.also { println("area=${it.area()}") }
    println("$box / $area / $sameBox")
}

比較:applyとalso

どちらもレシーバーを返します。applyはthisを使用します(フィールドの設定に適しています)。alsoはitを使用します(レシーバーを明示的に参照する場合、特に副作用での利用に適しています)。

class Item { var name = "" }
fun main() {
    val a = Item().apply { name = "apply" } // implicit this
    val b = Item().also { it.name = "also" } // explicit it
    println("${a.name} / ${b.name}")
}

比較:letとrun

どちらもラムダの結果を返します。letはitを使用します(単純な変換やnull安全性に適しています)。runはthisを使用します(多くのメンバーを呼び出す場合に適しています)。

class Calculator(val a: Int, val b: Int) {
    fun sum() = a + b
    fun product() = a * b
}
fun main() {
    val calc = Calculator(3, 4)
    val s = calc.let { it.sum() }                  // simple
    val combo = calc.run { "sum=${sum()} product=${product()}" } // multi-member
    println("$s / $combo")
}

実践的なパイプライン

実際のチェーンでは、複数のスコープ関数を組み合わせることがよくあります。

class Request(var url: String = "", var headers: Map<String, String> = emptyMap())
fun main() {
    val response = Request()
        .apply {
            url = "https://api.example.com"
            headers = mapOf("Accept" to "json")
        }
        .also { println("request: ${it.url}") }
        .let { req -> "GET ${req.url}" }
    println(response)
}

チートシート

適切なツールを選ぶためのクイックリファレンスです。

// apply: this, returns receiver — configure object
// also: it, returns receiver — side effects in chain
// let: it, returns lambda result — transform / null-safety
// run: this, returns lambda result — multi-member compute
// with: this, returns lambda result — group operations on existing obj
fun main() { println("Scope functions: pick by receiver style + return value") }

クイックチェック

thisをレシーバーとして受け取り、かつレシーバー自体を返すスコープ関数はどれですか?

振り返り

意図に応じてスコープ関数を選択します。apply(設定+自身を返す)、also(副作用+自身を返す)、let(itを使った変換)、run(thisを使った変換)、with(既存オブジェクトに対する操作のグループ化)です。レシーバーの参照方法と返り値という2つの軸によって、適切な選択が決まります。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「適切なスコープ関数の選び方:判断ガイド」レッスンは無料ですか?

はい。「適切なスコープ関数の選び方:判断ガイド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「適切なスコープ関数の選び方:判断ガイド」で何を学びますか?

レシーバー、戻り値の型、意図に基づいて適切なスコープ関数を選択します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「適切なスコープ関数の選び方:判断ガイド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. applyとwith:設定して返す
  2. letとrun:変換とスコープ
  3. also:レシーバーを変更せず副作用を実行する
  4. 適切なスコープ関数の選び方:判断ガイド
← Kotlin Academyに戻る