Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

#36 Kotlin Koans Builders/Function literals with reciever 解説

1 はじめに

Kotlin公式リファレンスのKotlin Koans Builders/Function literals with recieverの解説記事です。

Kotlin Koansを通してKotlinを学習される人の参考になれば幸いです。

ただし、リファレンスを自力で読む力を養いたい方は、
すぐにこの記事に目を通さないで下さい!

一度各自で挑戦してから、お目通し頂ければと思います:fist:

2 レシーバー

まず実際の例を見てみましょう。

Example
val sum: Int.(Int) -> Int = { other -> plus(other) }

上の例の1番左側のIntレシーバーとよびます。
(左から2番目のInt引数の型、左から3番目のInt戻り値の型を表します。)

つまり、

レシーバーは関数型(function types)の呼び出しもとのインスタンスの型を指定します。

3 Builders/Function literals with reciever の解説

Kotlin Koans Builders/Function literals with reciever の解説です。
随時本サイトの内容を引用させていただきます。

本文とコードを見てみましょう。

Read about function literals with receiver.

You can declare isEven and isOdd as values, that can be called as extension functions. Complete the declarations below.

Function_literals_with_reciever
fun task(): List<Boolean> {
    val isEven: Int.() -> Boolean = { TODO() }
    val isOdd: Int.() -> Boolean = { TODO() }

    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

レシーバーが示すように、変数isEvenisOddはInt型のインスタンスから参照されることがわかります。
(実際に、以下のコードでは42/239/294823098といったInt型のインスタンスが呼び出していますね。)

isEvenは呼び出しもとのインスタンスが偶数ならばtrueを返す、isOddは呼び出し元のインスタンスが奇数ならばtrueを返すように実装します。

したがって、以下のような実装になります。

Function_literals_with_receiver
fun task(): List<Boolean> {
    val isEven: Int.() -> Boolean = { this % 2 == 0 }
    val isOdd: Int.() -> Boolean = { this % 2 != 0 }

    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

this % 2 != 0this % 2 == 1でもOKです。)

4 最後に

次回はKotlin Koans Builders/String and map buildersの解説をします:muscle:

G-o
企業でAndroidエンジニアとして働いております。 趣味は筋トレ、お酒を飲むことです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away