スコープ関数 (Kotlin)
読み:すこーぷかんすう
外語:scope functions
Kotlinにおいて、引数にとる関数のスコープを変更するための関数。
概要
C/C++の場合、関数内で {} で囲めばそれがスコープになる。スコープ内で定義した変数は、スコープ外に波及しない。
Kotlinの場合、C/C++と違ってプログラム中で唐突に {} で囲ってスコープにすることはできない。同様のことをしたい場合は、たとえ返却値が不要な場合であってもその部分をスコープ関数にする必要がある。
特徴
目的
結果を変数に代入してそれを使い回すよりも、結果を例えばスコープ関数letを用いit等で参照する方が、{}で影響範囲が明確になるという利点がある。
影響範囲を明確化することは、意図しない箇所での誤った参照、代入や書き換えといったバグを避けることもなり、開発効率ならびに後からソースを見た時の見やすさ向上にも大きく寄与する。
種類
Kotlin 1.0で4種類、Kotlin 1.1からalsoが追加され5種類となっている。
使い方は自由であるが、その主たる目的で大きく2種類に分けられ、スコープ内で対象オブジェクトがどう設定されるかでも2種類に分けられる。
- プロパティの設定
- apply ‐ 元をthisで参照し、戻り値は呼び出し元のインスタンス
- also ‐ 元をitで参照し、戻り値は呼び出し元のインスタンス。ラムダ式として記載でき、名前が付けられる
- メソッドの実行
- run ‐ 元をthisで参照し、戻り値は呼び出し元の任意の型
- with ‐ 元をthisで参照し、戻り値は呼び出し元の任意の型
- let ‐ 元をitで参照し、戻り値は呼び出し元の任意の型。ラムダ式として記載でき、名前が付けられる
使い分け
スコープ関数の戻り値を使う場合は、元のインスタンスか任意の型かで選択することになる。
また、元のオブジェクトをthisで参照するかitで参照するかも都合に合わせて選択できる。
元の参照がthisになるものを使う場合、thisは省略可能であるが、スコープの内外でthisの意味が変わってしまうことに注意が必要である。
元の参照がitになるものを使う場合、itは省略できないが、スコープの内外でthisの意味が変わらないという利点がある。
ラムダ式
元の参照がitになるタイプのスコープ関数(alsoおよびlet)は、{} 内にラムダ式を記述することで、itに別名を与えることができる。
たとえば obj?.let { hoge -> ...} のように書くことで、it の代わりの変数名を指定することができる(この例の場合はhoge)。
再検索