DEV Community

kaede
kaede

Posted on • Edited on

Kotlin 基礎 Part 6 -- ブロック内部でスコープ関数を使って処理する

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)

Enter fullscreen mode Exit fullscreen mode

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)}
Enter fullscreen mode Exit fullscreen mode

2

    fun get1OrNull(): Int?{
        return null
    }
    get1OrNull()?.run { println(this+1) }
Enter fullscreen mode Exit fullscreen mode

こちらも Null 安全な実行ができる。


with

    fun get1(): Int{
        return 1
    }
    val withTest = with(get1()) { this + 1 }
    println(withTest)
Enter fullscreen mode Exit fullscreen mode

2

with は引数で関数の結果をレシーバーとして受け取る。
そして次のブロックで this として扱い処理し、返り値とする。

どうみても run の方が使いやすい。


apply

    fun get1(): Int{
        return 1
    }
    val applyTest = get1().apply { this + 1 }
    println(applyTest)
Enter fullscreen mode Exit fullscreen mode

1

apply はブロックの結果を返さない。
let や with とはそこが違う。

apply を当てた関数が返って来ている。

    data class Dog(var name: String)
    val pochi = Dog("Pochi")
    val applyTest = pochi.apply { this.name = "Hachi" }
    println(applyTest)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Dog(name=E, age=10)

Dog クラスから pochi というインスタンスを作って
also でインスタンスの中身にアクセスして、name と age を変えられた。

    val alsoTest = pochi.also { dog ->
        dog.name = "E"
    }
Enter fullscreen mode Exit fullscreen mode

let と同じく、it に名前をつけて扱うこともできる。

Top comments (0)