2015-09-12

Kotlinことはじめ:(9)関数深堀り

これまでも、なんだかんだで関数を書いていますが、今回は関数を掘り下げてみます。

関数宣言

基本

基本は以前にも書いた書き方。

[スコープ] fun 関数名([仮引数...])[:戻り値の型] {

    処理

}
処理が式一つであれば、次のような書き方ができます。

[スコープ] fun 関数名([仮引数...])[:戻り値の型] = 式
戻り値の型は式から類推できるため、省略可能です。

名前付き引数とデフォルト値

Kotlinでは引数にデフォルト値を設定することができます。

fun String.xxx(start: Int = 0, end: Int = this.length()) {
 ...
}
さらに、関数を呼ぶ際に、どの引数に値を渡すのかを指定できるため、

val text="あいうえお"

println(text.xxx(1, 4))

println(text.xxx(start=2))

println(text.xxx(end=2))
のような呼び分けが可能になっています。

関数はオブジェクト

Kotlinでは関数をオブジェクトとして扱うことができます。
そのおかげで関数を引数として渡したり、戻り値として返すこともできます。

関数型

関数オブジェクトを引数として受け取ったり、返したりする関数や、関数オブジェクトを保持する変数を作るには、関数の型を指定する必要が出てきます。
以下のように書きます。

([仮引数])[->戻り値の型]

関数リテラル

関数リテラルは文字通り、関数のリテラルです。文字列リテラルを書くと、Stringオブジェクトが作られるように、関数リテラルを書くと関数オブジェクトが作られます。
次のように書きます。

{ 引数 -> 処理}
次のような関数を呼ぶ際に、

fun List<T>.xxx(condition: (T, T)->Int) {

...

}
以下のように使用します。

val list = asList(1,2,3,4,5,6)

list.xxx({ left,right -> left - right})
関数に引数として渡す場合は格納先の型から類推できるため、上記のようにリテラルの引数の型を省略することができますが、格納先に関数型が指定されていない場合は、引数に型を指定する必要があります。

val xxx = { left: Int, right: Int -> left - right })

関数式

関数式も関数オブジェクトが作られます。
次のように書きます。

fun(引数) = 式
リテラルと同じ例では、以下のようになります。

val list = asList(1,2,3,4,5,6)

list.xxx(fun(left,right) = left - right)
リテラル同様引数の方を類推できない場合は、引数の型を指定します。

val xxx = fun(left: Int, right: Int) = left - right

既存関数からのオブジェクト取得

リテラルや式によって直接オブジェクトを作るのではなく、普通に関数を作っておいてそこからオブジェクトを取得することもできます。

list.xxx(::otherFunction)

0 件のコメント: