Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
run / with
オブジェクトのコンテキスト内でコードブロックを実行し、その結果を返すスコープ関数です。『run』はオブジェクトの拡張関数、『with』はオブジェクトを引数に取る通常関数として使います。
構文
// run:拡張関数として呼び出します。ラムダ内で this としてオブジェクトを参照します。
オブジェクト.run {
// this を省略してプロパティ・メソッドにアクセスできます。
戻り値
}
// with:通常関数として呼び出します。オブジェクトを引数に渡します。
with(オブジェクト) {
// this を省略してプロパティ・メソッドにアクセスできます。
戻り値
}
概要
| 関数 | コンテキスト参照 | 戻り値 | 主な用途 |
|---|---|---|---|
| run { } | this(省略可) | ラムダの結果 | オブジェクトの設定+結果取得 |
| with(obj) { } | this(省略可) | ラムダの結果 | 非null オブジェクトへの複数操作 |
サンプルコード
data class User(var name: String, var age: Int, var email: String)
fun main() {
// run:オブジェクトのプロパティを使って計算します。
val user = User("太郎", 25, "taro@example.com")
val summary = user.run {
// this = user です。this は省略できます。
"名前: $name, 年齢: $age"
}
println(summary) // 名前: 太郎, 年齢: 25
// run:null チェックと処理を組み合わせます。
val nullableUser: User? = user
val result = nullableUser?.run {
"メール: $email"
}
println(result) // メール: taro@example.com
// with:複数のプロパティを参照する処理をまとめます。
val report = with(user) {
buildString {
appendLine("=== ユーザー情報 ===")
appendLine("名前: $name")
appendLine("年齢: $age")
append("メール: $email")
}
}
println(report)
// with:オブジェクトを変更しながら使います。
val numbers = mutableListOf(3, 1, 4, 1, 5, 9)
val max = with(numbers) {
sort()
last() // ラムダの最後の式が戻り値になります。
}
println("最大値: $max") // 最大値: 9
}
概要(詳細)
『run』と『with』はどちらもラムダ内で『this』(省略可)としてオブジェクトを参照し、ラムダの最後の式を戻り値として返します。主な違いは呼び出し方で、『run』は拡張関数として『オブジェクト.run { }』と書き、『with』は通常関数として『with(オブジェクト) { }』と書きます。
『with』はnull安全呼び出し(『?.』)と組み合わせられないため、nullになりうるオブジェクトには『run』を使ってください。複数のメソッドを呼び出すだけでよく結果が不要な場合は、戻り値がレシーバー自身の『apply』を検討してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。