why
ブロック処理は Kotlin の基礎であり、必須だと気づいたから
参考
https://www.amazon.co.jp/gp/product/B091PGXHJY/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1
Kotlin サーバーサイドプログラミング実践開発
Page 100 of 495
https://www.digitalocean.com/community/tutorials/kotlin-let-run-also-apply-with
Digital Ocean
// Tutorial //
Kotlin let, run, also, apply, with
5 つのスコープ関数
with
run
let
apply
also
これらの 5 つのスコープ関数が有る。
これは関数やインスタンスに追加したり、引数として取ることで拡張できる。
let
https://blog.mindorks.com/using-scoped-functions-in-kotlin-let-run-with-also-apply
一番シンプル。関数に追加すると、その関数の結果を it として扱えるブロックを作成できる。
fun get1(): Int{
return 1
}
val letTest = get1().let { it + 1 }
println(letTest)
2
ここでは 1 を返す関数に let をつけたので
it が 1 として扱われ、1 + 1 で 2 が返ってくる。
前の記事に書いたように、?.let を使うことで null ではない場合のみ実行できる。これによって nullable な値もぬるぽの心配なく安全に扱える。
run
run では it ではなく this で元の関数の返り値が扱える。
fun get1(): Int{
return 1
}
get1().run { println(this+1)}
2
fun get1OrNull(): Int?{
return null
}
get1OrNull()?.run { println(this+1) }
こちらも Null 安全な実行ができる。
with
fun get1(): Int{
return 1
}
val withTest = with(get1()) { this + 1 }
println(withTest)
2
with は引数で関数の結果をレシーバーとして受け取る。
そして次のブロックで this として扱い処理し、返り値とする。
どうみても run の方が使いやすい。
apply
fun get1(): Int{
return 1
}
val applyTest = get1().apply { this + 1 }
println(applyTest)
1
apply はブロックの結果を返さない。
let や with とはそこが違う。
apply を当てた関数が返って来ている。
data class Dog(var name: String)
val pochi = Dog("Pochi")
val applyTest = pochi.apply { this.name = "Hachi" }
println(applyTest)
Dog(name=Hachi)
しかし、レシーバーで apply 元のインスタンスのプロパティなどを変更した新しいインスタンスを作成できる。
name プロパティを Pochi として作成した Dog のインスタンスを
apply を使って name プロパティを Hachi に変更した新しいインスタンスを作成することができた。
also
also も apply と同じく本体を返す。
apply と違っていくつでもつなげていくことができる。
also では it を使う。
data class Dog(var name: String, var age: Int)
val pochi = Dog("D",3)
val alsoTest = pochi.also { it.name = "E" } .also { it.age = 10 }
println(alsoTest)
Dog(name=E, age=10)
Dog クラスから pochi というインスタンスを作って
also でインスタンスの中身にアクセスして、name と age を変えられた。
val alsoTest = pochi.also { dog ->
dog.name = "E"
}
let と同じく、it に名前をつけて扱うこともできる。
Top comments (0)