applyとwith:設定して返す
applyとwithを使ってオブジェクトを設定し、それぞれの戻り値を理解します。
「applyとwith:設定して返す」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
スコープ関数のまとめ
Kotlin のスコープ関数(apply、also、let、run、with)を使うと、オブジェクトのコンテキストでブロックを実行できます。それぞれ、レシーバー(this と it)と戻り値が異なります。
apply の基本
apply { ... } は、this をレシーバーに束縛してブロックを実行し、レシーバー自体を返します。オブジェクトの設定に最適です。
class Person {
var name: String = ""
var age: Int = 0
}
fun main() {
val p = Person().apply {
name = "Ada"
age = 35
}
println("${p.name}, ${p.age}")
}apply が便利な理由
apply を使わない場合、設定用の一時変数を用意してから、その変数を返す必要があります。apply を使えば、これを 1 つの式にまとめられます。
class Config {
var host: String = ""
var port: Int = 0
}
fun makeConfig(): Config {
// Without apply:
// val c = Config(); c.host = "x"; c.port = 8080; return c
return Config().apply {
host = "localhost"
port = 8080
}
}
fun main() {
val c = makeConfig()
println("${c.host}:${c.port}")
}チェーン内の apply
apply はレシーバーを返すため、そのまま後続のメソッド呼び出しにつなげられます。
class Builder {
val parts = mutableListOf<String>()
}
fun main() {
val result = Builder().apply {
parts.add("hello")
parts.add("world")
}.parts.joinToString(" ")
println(result) // hello world
}with の基本
with(receiver) { ... } は、this をレシーバーに設定してブロックを実行し、ラムダの結果を返します(レシーバーは返しません)。レシーバーから派生した値を求める場合に便利です。
class Rect(val w: Int, val h: Int)
fun main() {
val area = with(Rect(3, 4)) {
w * h
}
println(area) // 12
}apply と with
apply はレシーバーを返すため、ビルダーに最適です。with はラムダの結果を返すため、レシーバーから値を計算する場合に最適です。
class Box(var width: Int = 0, var height: Int = 0)
fun main() {
val box = Box().apply { width = 10; height = 20 } // returns Box
val area = with(box) { width * height } // returns Int
println("$box area=$area")
}List での apply
可変コレクションをインラインで設定します。
fun main() {
val list = mutableListOf<String>().apply {
add("a")
add("b")
add("c")
}
println(list)
}apply は同じ型を返す
apply の戻り値の型は常にレシーバーの型です。明示的な戻り値を記述する必要はありません。
class Sb {
private val buf = StringBuilder()
fun append(s: String): Sb { buf.append(s); return this }
fun build(): String = buf.toString()
}
fun main() {
val s = Sb().apply {
append("Hello, ")
append("Kotlin!")
}.build()
println(s)
}with で複数のメンバーを再利用
with の内部では、レシーバーのすべてのメンバーがスコープ内に入るため、obj. のプレフィックスは必要ありません。
class Person(val name: String, val age: Int)
fun main() {
val description = with(Person("Ada", 35)) {
"Name: $name, Age: $age, AgeNext: ${age + 1}"
}
println(description)
}ネストした apply
階層的な設定を行うために、apply の内部に別の apply をネストできます。ただし、必要最小限にとどめてください。
class Address {
var city: String = ""
var zip: String = ""
}
class User {
var name: String = ""
var address: Address = Address()
}
fun main() {
val u = User().apply {
name = "Ada"
address.apply {
city = "Istanbul"
zip = "34000"
}
}
println("${u.name} in ${u.address.city}")
}apply を使わない場面
レシーバーを返す必要がない場合は、名前付き引数を使った通常の生成や let/run を優先してください。変化をつけるためだけに apply を使わないでください。
class Config(val host: String, val port: Int)
fun main() {
// Named arguments often beat builder + apply:
val cfg = Config(host = "localhost", port = 8080)
println("${cfg.host}:${cfg.port}")
}クイックチェック
ブロックの実行後、apply は何を返しますか?
振り返り
applyはレシーバーをthisにしてブロックを実行し、レシーバーを返します。オブジェクトの設定に最適です。withはレシーバーをthisにしてブロックを実行し、ラムダの結果を返します。派生値の計算に最適です。設定が単純な場合は、名前付き引数を使用してください。
よくある質問
「applyとwith:設定して返す」レッスンは無料ですか?
はい。「applyとwith:設定して返す」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「applyとwith:設定して返す」で何を学びますか?
applyとwithを使ってオブジェクトを設定し、それぞれの戻り値を理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「applyとwith:設定して返す」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- applyとwith:設定して返す
- letとrun:変換とスコープ
- also:レシーバーを変更せず副作用を実行する
- 適切なスコープ関数の選び方:判断ガイド