初めてのコトリン 〜Learning Kotlin〜 その1

Kotlin とは

IntelliJ IDEA 開発元の JetBrains社 の Andrey Breslav と Dmitry Jemerov にて開発されているオブジェクト指向言語。ロシアにある JetBrains社 のラボ近くのコトリン島が名前の由来。Kotlin はフィンランド語でやかんを表すため、ロゴがやかんになっている(このロゴは早めに変えたほうがいいと思う)。


Kotlin のゴールとして

  • Java との完全な相互運用ができて
  • コンパイル速度は Java と同等
  • Java より簡素で
  • Java よりエラーの発生が抑えられ
  • Scala より簡単

とされている。ターゲットプラットフォームは JVM であり、Java バイトコードを出力する。最近では JavaScript へのコンパイルも可能となっている。、2011年7月に発表、2012年2月に Apache 2 Open Source License にてオープンソース化された。2011年6月にマイルストーン安定版 M2 がリリースされた。


はじめに

IntelliJ のプラグインにて IDE サポートがある。その他にKotlin Web Demo にてブラウザ上で動作させることができる。

ここでは本家のGetting Startedをかいつまんで。

Kotlin pluginのインストール
プロジェクトの作成
  • File -> New Project にて Java Module の新規プロジェクト作成
  • 作成したプロジェクトの src を選択して右クリック New -> Kotlin file (ファイル名はなんでも良い)
  • Kotlin ファイルを開くと上部に Kotlin Runtime を指定せよ と出るのでクリックして登録
  • 以下のコードを入力
fun main(args: Array<String>): Unit { 
  println("Hello world!") 
}
  • 作成したファイルを選択して右クリック "Run"で実行


Hello, world!

最初の一歩は古典。

package demo 
 
fun main(args : Array<String>) { 
  println("Hello, world!") 
}
  • Java と同じくpackage がある(指定しない場合はデフォルトパッケージ)
  • 関数は楽しげに fun ではじめる
  • 型は変数名の後に:でつなげる
  • 行末のセミコロンはオプション
  • 上記例は関数の戻り値を省略している(省略しない場合は fun main(args : Array) : Unit )

コマンドライン引数と文字列テンプレート

fun main(args : Array<String>) {
  if (args.size == 0) {
    println("Please provide a name as a command-line argument")
    return
  }
  println("Hello, ${args[0]}!")
}
  • コマンドライン引数(args)はArray型で、sizeプロパティにてサイズが得られる
  • args[0]のように要素数を指定して値を取得
  • 文字列テンプレートで${}にて変数を埋め込み可能

forループ

fun main(args : Array<String>) {
  for (name in args)
    println("Hello, $name!")
}
  • forループも普通
  • 実際には「for (val name : String in args)」の省略で型推論されてる
  • 文字列テンプレートは1つの変数と解釈できる場面では$のみで記述できる(args[0]の場合は{}が必要)

クラス

class Greeter(val name : String) {
  fun greet() {
    println("Hello, $name");
  }
}

fun main(args : Array<String>) {
  Greeter(args[0]).greet()
}
  • クラスは class キーワードで指定
  • プロパティはクラス名の後に指定(Scalaと同じ)
  • クラスのインスタンス化に new は不要
  • クラスにはメンバ関数を定義できる

パターンマッチ

fun main(args : Array<String>) { 
  val language = if (args.size == 0) "EN" else args[0] 
  println(when (language) { 
    "EN" -> "Hello!" 
    "ES" -> "&#161;Hola!" 
    "RU" -> "Привет!" 
    else -> "Sorry, I can't greet you in $language yet" 
  }) 
}
  • if 式は値を返す
  • val はイミュータブルなローカル変数として使われている
  • when 式にてパターンマッチができ値を返す

拡張Function

fun String.hello() { 
  println("Hello, $this!") 
} 
 
fun main(args : Array<String>) { 
  "world".hello() // prints 'Hello, world!' 
}
  • 既存のクラスを拡張する関数を定義できる(上記はStringクラスに関数を加えている)
  • 拡張Function内では自身をthis参照できる

高階関数

fun main(args : Array<String>) { 
  args filter {it.length() > 0} forEach {print("Hello, $it!")} 
}
  • 関数の呼び出しは「.」に替りスペースで記述もできる
  • filter は述語関数を渡せる高階関数