表示テーマ
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)がまとまっています。