関数

Kotlin の関数について記載します。

ゴール

以下について理解すること。

  • 関数の定義の仕方、使い方
    • 単一の式からなる関数
    • 名前付き引き数、デフォルト引数
    • 可変長引数
    • 再帰呼び出し (末尾呼び出し最適化)
    • ローカル関数

関数とは?

  • 何か(引数)を入れると、何らかの計算や処理を行って、入れた人に結果(戻り値)を返すもの。それ以上は省略。

色々な関数定義の仕方

  • 基本形
//sampleStart
// fun で始まる以下の形が基本の関数定義の仕方
// fun 関数名(引数リスト): 戻り値の型
fun add(a: Int, b: Int): Int {
    return a + b
}
//sampleEnd

fun main(args: Array<String>) {
    println("a=1, b=2, add(a, b)=${add(1, 2)}")
}
  • 単一の式からなる関数の場合
//sampleStart
// Int を 2 つとって足した数を返す関数
// 処理が一個しかない (式が一個) の場合はこんな風に書ける
fun add(a: Int, b: Int): Int = a + b
//sampleEnd

fun main(args: Array<String>) {
    println("a=1, b=2, add(a, b)=${add(1, 2)}")
}
//sampleStart
// Int を 2 つとって大きい方を返す関数
// if 文 1 個ということも可能
fun max(a: Int, b: Int): Int = if (a > b) a else b
//sampleEnd

fun main(args: Array<String>) {
    println("a=1, b=2, max(a, b)=${max(1, 2)}")
}
//sampleStart
// Int を 2 つとって小さい方を返す関数
// 戻り値の型に型推論が効く
fun min(a: Int, b: Int) = if (a < b) a else b
//sampleEnd

fun main(args: Array<String>) {
    println("a=1, b=2, min(a, b)=${min(1, 2)}")
}
  • 文を持つ
//sampleStart
// 文を扱うときはこう
// Int を 2 つ引数に取って足し合わせた結果を返しつつ、画面に結果を出す関数
fun addWithPrint(a: Int, b: Int): Int {
    val result = a + b
    println(result)
    return result
}
//sampleEnd

fun main(args: Array<String>) {
    println("a=1, b=2")
    addWithPrint(1, 2)
}
//sampleStart
// Int の配列を引数にとって全部足し合わせたものを返す関数
fun sum(ints: Array<Int>): Int {
    var sum = 0
    for (n in ints) {
        sum += n
    }
    return sum
}
//sampleEnd

fun main(args: Array<String>) {
    println("ints=[1, 2, 3, 4], sum(ints)=${sum(arrayOf(1, 2, 3, 4))}")
}
  • 名前付き引数
fun main(args: Array<String>) {
    //sampleStart
    // どの引数に値を渡すか、引数の名前を指定できる
    fun name(first: String, last: String) = println("$first $last")

    // 名前を指定せずに呼び出すとき
    name("taro", "yamada")  // taro yamada

    // 名前を指定して呼び出すとき
    // 関数定義の順番に従う必要がなく、意味も分かりやすくなる場合もある
    name(last = "yamada", first = "taro")   // taro yamada
    //sampleEnd
}
  • デフォルト引数
fun main(args: Array<String>) {
    //sampleStart
    // デフォルトの値を指定してくことができる
    // 呼び出し時に値を指定しなかった場合はデフォルト値が使われる
    fun greet(name: String = "anonymous") {
        println("Hi, $name!")
    }

    greet()         // Hi, anonymous!
    greet("BOB")    // Hi, BOB!
    //sampleEnd
}
  • 可変長引数
fun main(args: Array<String>) {
    //sampleStart
    // 引数に "vararg" をつけると可変長 (任意の個数、引数入力が可能) という意味になる
    fun sum(vararg ints: Int): Int { // 引数として任意の数の Int をとる
        var sum = 0
        for (n in ints) {
            sum += n
        }
        return sum
    }

    // 呼び出し例
    println(sum(1, 2, 3, 4))    // 10

    // 配列を可変長引数として扱ってもらうこともできる
    var array = intArrayOf(1, 2, 3, 4, 5)
    // * をつけると配列を可変長引数として扱ってもらえる
    println(sum(*array))        // 15
    //sampleEnd
}

results matching ""

    No results matching ""