also (Kotlin)
読み:おーるそー
外語:also
Kotlinに5種類あるスコープ関数のうちの一つ。Kotlin 1.1から追加された。
概要
元をitで参照し、戻り値は呼び出し元のインスタンスとなるスコープ関数である。
Kotlinにおいてitは予約語ではないので任意に変数として用いることが可能であるが、letのスコープ内では元のオブジェクトを暗黙的に一時変数名 it として設定する。
定義
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
特徴
動作
メソッドの実行をするような場合に使われることが多い。
元のオブジェクトはitで参照できる。itはthisと違って省略することができないが、スコープ内でもthisは変化しないためスコープの内外でthisの意味が変わらないという利点がある。
元のオブジェクトがnullableの場合、obj?.also {} という構文を取ると、objがnullの場合は {} 内は実行されないが、nullではない場合は {} 内が実行される。この時、itにはnon-nullの変数が設定される。
名前を付けられる
何も指定しなければ it になるところ、{} 内の記述をラムダ式として記載すると、それが変数名になる、
つまり obj?.also { hoge -> ...} のように書くことで、it の代わりの変数名を指定することができる(この例の場合はhoge)。
non-nullの場合のみの動作
この動作の特徴を用いると、Javaであれば
if (hoge != null) { ... }
と書かれるところ、次のように書くことができる。
hoge?.also { ... }
スコープ内ではitに元のオブジェクト(この例ではhoge)のnon-nullが設定されるため、?や!!を書く必要がなく、プログラムの記述もシンプルにできる利点がある。
nullかnon-nullかで切り替える
?.とエルビス演算子を併用する。
hoge?.also {
// non-nullの処理
} ?: run {
// nullの処理
}
この結果を用いず破棄するような処理の場合は、alsoでもletでも同じ結果になる。
この結果を用いる場合、letだとその返却値は {} 内の結果であるため、意図せぬ結果になることがある。そういった場合はalsoを使うべきである。
再検索