0Pricing
Kotlin Academy · レッスン

with

操作をまとめます

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

with関数

withは、オブジェクトを呼び出しのレシーバーではなく引数として受け取り、そのオブジェクトをthisとするブロックを実行するスコープ関数です。ラムダの結果を返します。

withの基本的な使い方

オブジェクトをwithに渡すと、ブロック内でそのメンバーに直接アクセスできます。

fun main() {
    val name = "Kotlin"
    val description = with(name) {
        "$this has $length characters"
    }
    println(description)
}

複数の操作をまとめる

同じオブジェクトに対して複数のメソッドを呼び出したり、複数のプロパティを読み取ったりする場合に、withが活躍します。オブジェクト名を繰り返さずに済みます。

fun main() {
    val sb = StringBuilder()
    with(sb) {
        append("Line 1\n")
        append("Line 2\n")
        append("Line 3")
    }
    println(sb)
}

withはthisを使う

runやapplyと同様に、withはオブジェクトをthisとして公開するため、メンバーアクセスにプレフィックスは必要ありません。

data class Rectangle(val width: Int, val height: Int)

fun main() {
    val rect = Rectangle(4, 5)
    val area = with(rect) {
        width * height
    }
    println("Area: $area")
}

withはラムダの結果を返す

ブロック内の最後の式の値がwithの結果になります。これはrunと同じです。

fun main() {
    val list = listOf(1, 2, 3, 4, 5)
    val summary = with(list) {
        "Size=$size, First=${first()}, Last=${last()}"
    }
    println(summary)
}

withとrunの違い

with(obj) { ... }とobj.run { ... }は、ほぼ同じ動作をします。違いは構文です。

  • runはオブジェクトに対して呼び出す拡張関数なので、セーフコールと組み合わせて使いやすい関数です。
  • withはオブジェクトを引数として受け取り、「このオブジェクトを使って処理する」という意味を自然に表します。
fun main() {
    val s = "data"
    val a = with(s) { uppercase() }
    val b = s.run { uppercase() }
    println("$a $b")
}

withはnull許容値には不向き

オブジェクトを引数として渡すため、withはセーフコール演算子ときれいに組み合わせられません。null許容レシーバーにはobj?.run { }またはobj?.let { }を使います。

fun main() {
    val name: String? = "Eve"
    name?.run { println("Hello $this") }
    println("with is awkward for nullables")
}

読み取りと計算をまとめて行う

複数のプロパティを読み取り、1つの結果を計算する処理を、読みやすい1つのブロックにまとめるのが一般的なパターンです。

data class Order(val items: Int, val pricePerItem: Int)

fun main() {
    val order = Order(3, 20)
    val total = with(order) {
        items * pricePerItem
    }
    println("Total: $total")
}

withで文字列を構築する

buildStringやStringBuilderと組み合わせると、withを使ってプレフィックスのないすっきりした構築コードを書けます。

fun main() {
    val report = StringBuilder()
    with(report) {
        appendLine("Report")
        appendLine("======")
        appendLine("All good")
    }
    print(report)
}

コレクションでwithを使う

同じリストに対して複数のコレクション関数を呼び出す場合も、リスト名を繰り返さずに済みます。

fun main() {
    val numbers = listOf(10, 20, 30)
    with(numbers) {
        println("Sum: ${sum()}")
        println("Max: ${max()}")
        println("Average: ${average()}")
    }
}

withを使う場面

nullでないオブジェクトに対して一連の操作を行い、必要に応じて結果を返したい場合は、withを選びます。「しばらくこのオブジェクトを操作する」という意図を示せます。

確認問題

withはどのようにオブジェクトを受け取りますか。

復習

withは、引数として渡された1つのnullでないオブジェクトに対する操作をまとめ、そのオブジェクトをthisとして公開し、ラムダの結果を返します。引数構文で記述するrunのようなものです。次は、それぞれの状況に適したスコープ関数の選び方を学びます。

よくある質問

「with」レッスンは無料ですか?

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

「with」で何を学びますか?

操作をまとめます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「with」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. letとrun
  2. applyとalso
  3. with
  4. 適切な関数の選び方
← Kotlin Academyに戻る