今まで記事を読んでも、「ん?どういうことだ?」ってなっていたスコープ関数

実際にやってみたら案外簡単だったので紹介を!

まず、スコープ関数とはなんぞやっていう話からですが
ざっくりといえばオプショナル変数で値があるときだけ実行してくれる便利な関数のことです!

このスコープ関数には、以下4種類の関数があります。

  • let
  • run
  • apply
  • also

やっていることは同じなんだけども、スコープ内変数と戻り値がそれぞれ違うので見ていきましょう。

let

まずは一番良く使うletから!
公式では、こうなってますね。

inline fun <TR> T.let(block: (T) -> R)R
 
スコープ内引数名は、自分で指定して、最後に自由な型を返せます。
イメージとしては、streamのmapをイメージするとわかりやすいです。
書き方としてはこう。

ここでは、numがnullでない場合は、num.toLong() を実行することになります。
もちろん、numがnullの場合はnullが返るため、resultの中身はnullになります。

run

たまーに使います。
runも同じように公式の定義を見てみます。

inline fun <R> run(block: () -> R)R
 
スコープ内引数が無いですが、これは、thisを指定します。
返り値はletと同じく最後に自由な型を返せます。
書き方はこうなります。

runのスコープ内では、num変数をthisとして扱い、toLong()の結果を返しています。
今回は Int → Long ですが、インスタンスを取得して、そのフィールドだけが欲しい時とかに便利です。

例えば、こんな感じで、Dataクラスはいらないけども、そのフィールドが欲しい時に有効!

apply

applyはインスタンスを生成して、中身を設定したいときによく使います。
公式定義はこんな感じ

inline fun <T> T.apply(block: T.() -> Unit)T

引数がthis、返り値もthis。
つまりスコープ内で自身の設定をする用ですね。
java8のstreamで言うところだと、peekをイメージしてもらうとわかりやすいです。
 
ちょっと極端だけどもこういう使い方をします。

これで文字列「abc」の1要素を持つlistを生成することができますよ!

also

alsoも自身を返すタイプの関数です。
公式定義はこんな感じ

inline fun <T> T.also(block: (T) -> Unit)T

applyとの違いは、引数がthisか変数かの違いですね。
thisを使っていると、applyのthisなのかActivityとかのようにそれを記述しているthisなのか
混合してしまうのを避けるために使います。

thisが増えるのも困りものなので、クラスの複雑さで使い分けるといいですね!

この4つを使い分けると、Kotlinが使いやすくなるので、是非習得していきましょう(≧∇≦)/

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.