こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのスコープ関数を記述する方法を解説するピヨ!
この第41章では、プログラミング言語であるKotlinのスコープ関数について、一緒に勉強していきましょう。
この記事を読めばプログラミング未経験の方も、Kotlinのスコープ関数について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。
※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。
【Kotlin】スコープ関数とは?
Kotlinでは、処理ブロック内のコードを簡潔にできる「スコープ関数」が、標準関数として用意されています。
ではまず、そもそもこのスコープ関数って何?という基本のところから勉強していきましょう。
ラムダ式を受け取る高階関数
スコープ関数は、ラムダ式を受け取る高階関数のことを言います。
受け取ったラムダ式の中で、オブジェクトを名前無しで呼び出しが可能になるので、コードを簡潔に記述することができます。
スコープ関数には主に5種類ある
Kotlinのスコープ関数と言われる主な標準関数には「apply」「also」「let」「run」「with」の5種類あります。
また、この5つのスコープ関数は大きく以下の2つに分けることができます。
thisを使う
まずapply、run、withの3つのスコープ関数は、呼び出し元の参照方法としてthisを使うという共通点があります。
呼び出し元の参照方法としてthisを使うことができ、またthisは省略することができるのでコードを簡潔に記述することができます。
itを使う
続いてalso、letの2つのスコープ関数は、呼び出し元の参照方法としてitを使うという共通点があります。
スコープ関数には「apply」「also」「let」「run」「with」の5種類あって、thisを使うものとitを使うものに分かれているピヨ!
【Kotlin】5つのスコープ関数をそれぞれ紹介
では5つのスコープ関数について、使い方や違いについてそれぞれ勉強していきましょう。
applyについて
applyは、インスタンスにプロパティを設定していくために使えるスコープ関数です。
applyを使うことで、プロパティ設定時にインスタンス名をいちいち記述する必要がなくなります。
サンプルコード
以下のサンプルコードでは、お菓子クラスに変更可能な3つのプロパティを持たせて、このクラスのインスタンスを生成しプロパティを設定していきます。
またapplyを使っていない場合と使っている場合で見比べて、applyがどういう関数なのか見ていきましょう。
fun main(){ //applyを使っていない場合 val snack1 = Snack() snack1.price = 150 snack1.name = "ポテチ" println(snack1.price) //applyを使っている場合 val snack2 = Snack().apply{ price = 200 name = "クッキー" } println(snack2.price) } class Snack(){ var price = 0 var name = "" }
出力
150 200
解説
applyを使っている場合と使っていない場合で見比べてみると、applyを使っている場合ではプロパティ設定時にインスタンス名を記述していないということがわかります。
このコードではインスタンスの生成と同時にapplyを呼び出し、そしてラムダ式を使いプロパティを設定しています。
applyのラムダ式の中では「this」を使ってレシーバ(.applyの左側のことで、ここではインスタンスのこと)を参照することもできます。
val snack2 = Snack().apply{ //thisを使ってインスタンスを参照 this.price = 200 this.name = "クッキー" }
ですがこのthisは省略することが可能ですので、基本的には省略します。
また、戻り値はプロパティが設定されたレシーバ(ここではインスタンス)です。
runについて
runはプロパティを設定するのではなく、そのレシーバに対して関数を実行するスコープ関数になります。
runでもレシーバをthisとして扱います。
サンプルコード
以下のサンプルコードでは、cookieという文字列に対してrunを使って関数を実行しています。
fun main(){ val snack = "cookie".run{ println(this) this.capitalize()//最初の文字を大文字に変換 } println(snack) }
出力
cookie Cookie
解説
runでも、レシーバをthisとして扱っているため、以下では「cookie」が出力されます。
println(this)
また以下ではthisを記述していますが、thisは省略することができます。
//省略する前 this.capitalize() //省略した後 capitalize()
またrunの戻り値は、ラムダ式の結果になります。
withについて
withは他のスコープ関数と記述の仕方が違いますが、動きはrunと同じです。
サンプルコード
以下のサンプルコードは、runで使用したコードのwithバージョンです。
fun main(){ val snack = with("cookie"){ println(this) this.capitalize() } println(snack) }
出力
cookie Cookie
解説
他のスコープ関数と違い、以下のようにwithでは通常の関数のように記述します。
with("cookie"){
withもrunと同じで戻り値がラムダ式の結果のため「Cookie」が変数snackに代入されています。
またwithで使うthisも省略可能です。
alsoについて
alsoは、applyと同じような使い方ですが、thisではなくitを使います。
サンプルコード
以下のサンプルコードはapplyの時と同じコードですが、thisの箇所がitになっています。
fun main(){ val snack2 = Snack().also{ it.price = 200 it.name = "クッキー" } println(snack2.price) } class Snack(){ var price = 0 var name = "" }
出力
200
解説
alsoでのラムダ式では、インスタンスを「it」で参照していて、このitは省略不可能ですので気を付けましょう。
it.price = 200 it.name = "クッキー"
このitはラムダ式の引数が1つだけのときに使えるitのことです。
letについて
letはrunと同じでプロパティを設定するのではなく、そのレシーバに対して関数を実行するスコープ関数です。
サンプルコード
以下のサンプルコードは、runで使用したコードのthisの箇所がitになっています。
fun main(){ val snack = "cookie".let{ println(it) it.capitalize()//最初の文字を大文字に変換 } println(snack) }
出力
cookie Cookie
解説
letのラムダ式内では、呼び出し元はalsoと同じで「it」で参照します。またitが省略できない点も同じで、戻り値はラムダ式の結果が入ります。
apply、run、withではthisを使い、also、letではitを使うピヨ!
またthisは省略できるピヨ!
【Kotlin】スコープ関数のまとめ
この記事では、プログラミング言語であるKotlinのスコープ関数について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。
関数 | 呼び出し元の参照 | 戻り値 |
---|---|---|
apply | this(省略可能) | 呼び出し元のインスタンス |
run | this(省略可能) | ラムダ式の結果 |
with | this(省略可能) | ラムダ式の結果 |
also | it | 呼び出し元のインスタンス |
let | it | ラムダ式の結果 |
今回勉強した「5つのスコープ関数」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。
種類も多いし似たようなものばっかで混乱しそうピヨ!使い道の違いを勉強してゆっくり覚えるピヨ!
コメント