Skip to content

7. objectとラムダ ​

学習目標: object、関数を受け取る引数、{ ... -> ... }の意味を分けて読める。

この章は発展編です。関数とクラスがまだ曖昧なら、第4・5章に戻って練習してから進めましょう。一度に暗記する必要はありません。

object:ひとつの実体に名前をつける ​

kotlin
object Settings {
    val power = 1.0
}

classはインスタンスを作るための定義ですが、このobject宣言は名前つきの実体をひとつ提供します。Settings()とは書かず、Settings.powerで使います。

MyParkourのobject ModBlocksもこの書き方です。登録したブロックや登録処理をまとめています。

関数も引数として渡せる ​

kotlin
fun applyPower(power: Double, transform: (Double) -> Double): Double {
    return transform(power)
}

(Double) -> Doubleは「Doubleを受け取り、Doubleを返す関数」という型です。ここでは数値だけでなく、数値をどう変えるかという処理そのものを受け取っています。

ラムダは名前をつけずに書く関数 ​

kotlin
val result = applyPower(1.0) { power ->
    power * 2.0
}

{ power -> power * 2.0 }がラムダです。powerが受け取る値の名前で、最後の式power * 2.0が結果になります。

最後の引数が関数の場合、そのラムダを丸括弧の外に書けます。上のコードは次と同じ意味です。

kotlin
val result = applyPower(1.0, { power -> power * 2.0 })

渡す処理を変えてみよう

applyPowerに渡すラムダでpowerを3倍にして、3.0を出力する。

目標の出力
3.0

自動採点ではありません。入力を変えた場合も結果を確かめてください。

ヒント 1

power -> の左が受け取る値の名前、右側が処理。

ヒント 2

ラムダの最後の式をpower * 3.0にしよう。

解答例
object Settings {
    val power = 1.0
}

fun applyPower(power: Double, transform: (Double) -> Double): Double {
    return transform(power)
}

fun main() {
    val result = applyPower(Settings.power) { power ->
        power * 3.0
    }
    println(result)
}

解答例を閉じて、もう一度自分で書いてみてください。これ以外の正しい書き方もあります。

コンストラクタへの参照 ​

ModBlocksの登録処理には、次のような引数があります。

kotlin
blockFactory: (BlockBehaviour.Properties) -> Block

これは「設定を受け取り、Blockを作って返す関数」を受け取るという意味です。::JumpPadBlockはコンストラクタへの参照で、作り方を渡しています。

JumpPadBlock(properties)はその場で実体を作ります。::JumpPadBlockを渡しただけでは、まだその実体は作りません。blockFactory(properties)が呼ばれるところで作られます。

companion object ​

kotlin
class ModInfo {
    companion object {
        const val MOD_ID = "myparkour"
    }
}

ModInfo.MOD_IDと、インスタンスを作らずに使えます。companion objectはクラスに関連づけたオブジェクトです。const valはコンパイル時に決まる定数を宣言する書き方で、どんなvalにでも付けられるわけではありません。

実際のMyparkourでは、この中にMOD_IDとid(path)がまとまっています。