【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でコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”ヒント” less=”非表示”]

ヒント

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

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

[/expander_maker] [expander_maker id=”1″ more=”答え” less=”非表示”]

答え

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(分母)になります。

[/expander_maker]

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

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

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

[itemlink post_id=”1743″]

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

[itemlink post_id=”1745″]