【Kotlin練習問題】拡張関数

Kotlin

拡張関数とは(extension function)

拡張関数とは特定の型に独自の関数を追加できる機能です。

拡張関数を宣言するには、関数を追加したい型のあとに .関数名(パラメーター) の形で拡張関数を追加します。例えば、以下はMutableList<Int>という型にswapというリストの中身を入れ替える拡張関数を追加するコードです。ちなみに拡張関数が追加される型(MutableList<Int>)のことをレシーバー型を呼びます。

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // thisはリストに対応しています。
    this[index1] = this[index2]
    this[index2] = tmp
}

拡張関数内のthisというキーワードはレシーバーオブジェクト(ドットの前で実際に渡されるレシーバー型のオブジェクト)に対応します。これでどのMutableList<Int>上でもswapという関数が呼び出せるようになりました。

val list = mutableListOf(1, 2, 3)
list.swap(0, 2) 

さらに以下のようにMutableListの中身の型を<T>にすれば、どのMutableListに対してもswapを使えるようにできます。Tのことをジェネリック型と呼びます。

fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

レシーバー型の式の中でジェネリック型を使えるようにするために、関数名の一番最初でもジェネリック型パラメーターを宣言します。

問題

次のコード中の拡張関数 Int.r()とPair.r()を実装し、IntとPairをデータクラスであるRationalNumber型に変換できるようにしてください。Pairはスタンダードライブラリに定義されているクラスです。ちなみにRationalNumberとは日本語で有理数を意味します。二つの整数を用いて分数で表せる数のことですね。

Pair:

data class Pair<out A, out B>(
    val first: A,
    val second: B
)

問題コード:

fun Int.r(): RationalNumber = TODO()

fun Pair<Int, Int>.r(): RationalNumber = TODO()

data class RationalNumber(val numerator: Int, val denominator: Int) //numerator:分子 denominator:分母

Kotlin Playgroundでコードの編集・動作確認ができます。

ヒント

Int.r()ではRationalNumberのコンストラクタのnumeratorにはレシーバーオブジェクトを、denominatorには1を渡します。

Pair.r()ではnumeratorにはfirst、denominatorにはsecondを渡します。

ヒント

答え

fun Int.r(): RationalNumber = RationalNumber(this, 1)

fun Pair<Int, Int>.r(): RationalNumber = RationalNumber(first, second)

data class RationalNumber(val numerator: Int, val denominator: Int)

[解説]

Int.r()のRationalNumber(this, 1)で、thisはレシーバーオブジェクトを意味します。たとえば、
4.r()とした場合、RationalNumber(4, 1)となります。

Pairクラスではパラメーターの最初に渡されたIntをfirst、二つ目をsecondとしているので、RationalNumber型に変換される際にはfirstがnumerator(分子)、secondがdenominator(分母)になります。

答え

その他の問題はこちらからどうぞ。

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました