1. ホーム
  2. kotlin

[解決済み] Kotlinでrun、let、apply、also、withを使うべき例

2022-05-06 06:06:02

質問

run, let, apply, also, with の各関数について、良い例があればと思います。

私は、以下の本を読みました。 この記事 しかし、まだ例がない

どのように解決するのですか?

これらの関数はすべて、現在の関数/変数のスコープを切り替えるために使用されます。これらは、一緒になっているものを一箇所にまとめておくために使われます(主に初期化)。

以下はその例です。

run - は欲しいものを何でも返し、この変数が使われている場所を this

val password: Password = PasswordGenerator().run {
       seed = "someString"
       hash = {s -> someHash(s)}
       hashRepetitions = 1000

       generate()
   }

パスワードジェネレータは、現在 this を設定することができます。 seed , hashhashRepetitions を変数を使用せずに使用することができます。 generate() のインスタンスを返します。 Password .

apply も同様ですが、これは this :

val generator = PasswordGenerator().apply {
       seed = "someString"
       hash = {s -> someHash(s)}
       hashRepetitions = 1000
   }
val pasword = generator.generate()

これは特にBuilderパターンの代わりとして、また特定の設定を再利用したい場合に有効です。

let - 主にNULLチェックを回避するために使用されますが、以下のような代替としても使用できます。 run . 違いは this は以前と同じで、再スコープされた変数にアクセスするには it :

val fruitBasket = ...

apple?.let {
  println("adding a ${it.color} apple!")
  fruitBasket.add(it)
}

上記のコードでは、リンゴがNULLでない場合にのみバスケットに追加されます。また it はもうオプションではありません。 そのため、ここで NullPointerException に遭遇することはありません。 ?. の属性にアクセスすることができます)。

also - を使いたいときに使います。 apply をシャドーイングする必要はない。 this

class FruitBasket {
    private var weight = 0

    fun addFrom(appleTree: AppleTree) {
        val apple = appleTree.pick().also { apple ->
            this.weight += apple.weight
            add(apple)
        }
        ...
    }
    ...
    fun add(fruit: Fruit) = ...
}

使用方法 apply ここで、シャドウ this で、そのため this.weight はリンゴを指すことになり ではなく はフルーツバスケットを意味します。


注:恥ずかしながら例題をパクりました 私のブログから