読者です 読者をやめる 読者になる 読者になる

算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Kotlinの関数について調べてみた

Kotlinの関数を調べましたので、そのまとめ。
※下記URLのサイトを参考にしました。英語、または技術的な知識が至らず、内容に誤りが含まれるおそれがありますので、ご了承ください(´;ω;`)
また、載せているコード例は自作のものであり、参考サイトから引用したものではありません。

※本エントリの8割は参考サイトの翻訳です。残りの2割は私の解釈で加筆や変更を施した構成です。

参考サイト:http://confluence.jetbrains.net/display/Kotlin/Functions

追記(2012-01-14 12:32)
インライン関数について追記しました。

基本

関数は通常、次のように定義します。

fun next(n : Int) : Int {
	return n + 1
}

funキーワードに続けて、関数の名前、引数、戻り値の型を指定します。
上記の関数は次のようにも記述できます。

fun next(n : Int) = n + 1

この形をSingle-expression functionというらしいです。日本語訳するなら単一式関数とかですかね。
単一式関数は戻り値の型を省略できます。

Unitを返す関数

関数が有用な値を何も返さない場合、関数の戻り値の型はUnitとなります。
(Unitはコンポーネントを持たないタプルの型であり、そのエイリアスはTuple0です。それが唯一持つ値は()で記述されます。タプルについてはまたの機会に)

fun sayHello() : Unit {
	println("Hello")
}

上記の関数は以下のようにも書き換えられます。

fun sayHello() : Unit {
	println("Hello")
	return
}
fun sayHello() : Unit {
	println("Hello")
	return ()
}
fun sayHello() {
	println("Hello")
}

最後の例のように、Unitを返す関数は、戻り値の型を省略できます。

ローカル関数

Kotlinでは、関数内に関数を定義できるローカル関数をサポートしています。
ローカル関数から外側の関数のローカル変数を参照することができます。
さらに、ローカル関数内でreturnをすると、外側の関数でもreturnされます。
…次のコードを読んでいただくとよくわかると思います。

fun foo() : String {
	fun bar() : String {
		return@foo "AAA"
	}

	bar()
	return "BBB"
}

ジェネリック関数

関数はジェネリックパラメータを持つことができます。
ジェネリックパラメータは関数名の後に <> ←こういう括弧で指定します。

可変長引数

最後の引数にvarargアノテーションをマークすることにより、それは可変長引数となります。

fun sum(vararg ints : Int) : Int {
	var sum = 0
	for(i in ints) {
		sum += i
	}
	return sum
}

デフォルト引数

引数はデフォルト値を持つことができます。これにより、Javaよりもオーバーロードされた関数の数を減らすことができます。

fun sayHello(name : String = "Taro") {
  println("Hello, $name!")
}

名付けられた引数

例えば上記の関数は次のように呼び出すことができます。

fun main(args : Array<String>) {
  sayHello(name = "Android")
}

引数が多く、かつデフォルト値が設定されている場合に非常に簡単に関数を呼び出すことが可能になります。

Infix calls

メンバ関数(または拡張関数)が1つだけ引数を取る場合、infix formで呼び出しができます。
つまり、レシーバの後のドットと引数の前後の括弧を省略できます。

infix callは2つのパラメータを必要とします。
例えば、print 1 は print の左側に何もないので、この形は許されません。

拡張関数

拡張関数(Extension function)は、レシーバとして型を持った関数を定義できる仕組みです。

fun Int.isFizz() : Boolean = this % 3 == 0

fun main(args : Array<String>) {
	println(100.isFizz)
}

高次関数

高次関数(Higher-order function)は、関数を引数に取ったり、関数を返したりする関数%E