【第41章】スコープ関数について詳しく解説

【第41章】スコープ関数について詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、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つのスコープ関数をそれぞれ紹介

では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つのスコープ関数」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

種類も多いし似たようなものばっかで混乱しそうピヨ!使い道の違いを勉強してゆっくり覚えるピヨ!

コメント

タイトルとURLをコピーしました