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フィードバックを取得できます。ローカル設定は不要です。