Kotlin / Programming

ザクっと理解するKotlin Functions

Kotlinで関数を学びたいけど、初めてだとわかりにくいと感じている方必見!

本記事では、Single-expression functionsやvarargs、ジェネリック関数、テイル再帰関数など、Kotlinにおける関数の基本概念から応用までを実例を用いてわかりやすく解説しています。

初心者にもオススメの記事なので、ぜひご覧ください!

簡単な説明とその下に各コードを載せています。コードは右上の緑再生ボタンを押せば動きます。

この記事はKotlin公式サイトを翻訳しながらわかりやすくまとめています。

Single-expression functions (単一式関数)

関数が1つの式を返す場合は波括弧を書かず、右辺に関数の中身を書くことができます。

またコンパイラが返り値の型を推測できる場合は返り値の型を省くこともできます。

Variable number of arguments (varargs) (可変長引数)

引数に渡せる値の数が複数でもOKです。パラメータの前にvarargとつける必要があります。

可変長として指定できるのは1つのパラメータだけです。

/*
// これは複数の可変長引数が指定されているためエラー
fun greeting(vararg names: String, vararg ages: Int): ArrayList<String> {
    val result: ArrayList<String> = ArrayList()
    
    for (name in names) {
        result.add("Hi, $name")
    }
    
    return result
}
*/

varargがパラメータの一番最後ではない場合はその後に続くパラメータに値を渡すにはパラメータ名を指定する必要があります。

もし後に続くパラメータが関数型の場合は括弧の外にラムダを書くことで渡すことができます。

varargパラメータが設定されている関数を呼ぶとき、arrayOf(1, 2, 3)のように引数を個別に渡すことができます。

infixキーワードが関数の前についている場合はinfix notation(中置記法)を使用することで呼び出すことができます。

中置記法とはドットと括弧を省いて記述することです。

しかしinfixキーワードを設定する関数は下記の条件を満たす必要があります。

  • メンバー関数もしくは拡張関数である
  • パラメータは1つだけ
  • パラメータは可変長ではなく、かつ初期値を持っていない

※中置記法はあいまいな構文を回避するため常にレシーバーとパラメータの両方を指定する必要があります。

Function scope (関数のスコープ)

Kotlinでは関数をファイル内の最上位で宣言できます。要するにJavaやC#などではクラス内で宣言しなければなりませんが、Kotlinでクラス内でなくても宣言できます。

加えて、メンバー関数や拡張関数のようにローカルに書くこともできます。

Kotlinでは関数の中に関数を書く、ローカル関数を使用できます。

メンバー関数はクラス内もしくはオブジェクト内に書く関数のことを言います。

メンバー関数の呼び出しはドットを用いて行います。

Generic functions (ジェネリック関数)

関数名の前に「<」と「>」を使用して関数にジェネリック型のパラメータを指定することができます。詳しくは後日。。。

ジェネリック型にすると呼び出すときにStringであろうとDoubleであろうと引数として指定できます。

Tail recursive functions (テイル再帰関数)

Kotlinではテイル再起を使うことができます。

通常はループで行う処理をスタックオーバーフローのリスクがない再帰関数で行うことができます。

tailrecをfunの前に付け、要件を満たす場合にコンパイラは再帰呼び出しを最適化して、高速で効率的なループベースのバージョンに変換します。

tailrecを使用するには、関数の最後の操作が自身を呼び出すことである必要があります。

自身の呼び出しの後にさらにコードがある場合、try/catch/finallyブロック内にある場合、またはオープンな関数である場合には、テイル再帰を使用することはできません。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です