はじめに
この記事はKotlin Advent Calendar 2014の11日目です。
昨日はyy_yankさんの【これは便利】知っててよかったKotlinのenum #ktac2014でした。 当アドベントカレンダーの記事ではありませんが、id:ayato0211さんが今日Kotlin のドキュメントが新しくなってた。あと Delegate とかそのへん。を書いてくださいました。
現在、Kotlinのバージョンは0.9.xで、もりもり開発中です。 ということで計画はされているけどまだ実装されていない機能も多いです。 今日は未実装の機能について紹介したいと思います。
参考
未実装の文法/機能
型エイリアス
M9のときにtypeキーワードがなくなったと聞いて、型エイリアスは実装しないことに決めたと思ったけど文法のドキュメントみたらそれらしいキーワードtypeAliasというのを見つけました。
public typeAlias Id = Long public typeAlias Name = String data class User(id: Id, name: Name)
こういう感じで使えるのかと思います。
パッケージの入れ子のやつ
Scalaみたいにpackageをコード中で入れ子にして表現できるっぽいです。
package foo {
package bar {
class Hoge
}
}
dynamic型
dynamicという型があります。
C#のそれと同じで、JavaScript用らしい(?)
自分型
Thisという型。
すでにIntelliJ IDEAのKotlinプラグインはこれをキーワードとして見ているみたいだけど、コンパイルエラーになります。
ローカル変数の委譲
Delegated Propertyの仕組みをローカル変数でやりたいらしいです。 https://youtrack.jetbrains.com/issue/KT-6228
数値リテラル
数値リテラルにアポストロフィを使えるようになるかもしれません。 https://youtrack.jetbrains.com/issue/KT-6341
Java7のようにアンスコも。 https://youtrack.jetbrains.com/issue/KT-2964
関数型の書式
シンプルに。
https://youtrack.jetbrains.com/issue/KT-6358
// 今 val map: (Int) -> Int // こうなる val map: Int -> Int
型パラメータにデフォルト指定
https://youtrack.jetbrains.com/issue/KT-1215
fun list<T = Nothing>(vararg a : T) = ReadOnlyList(a)
引数のデフォルト値から型推論
// 今
fun foo(s: String = "Default") {}
// これもOKにしたい
fun bar(s = "Default") {}
https://youtrack.jetbrains.com/issue/KT-2801
ループにelse
いるかなこれ。 https://youtrack.jetbrains.com/issue/KT-476
whenの分岐でのcontinue
https://youtrack.jetbrains.com/issue/KT-771
parameterKindと呼ばれる修飾子
ref, out, lazyの3つが定義されています(が、ドキュメントに説明はないと思われます)。
refとoutはC#にもありますね。
それと同じ意味だったらこんなことができます。
fun <T> swap(ref a: T, ref b: T) {
val w = a
a = b
b = w
}
val x = 5
val y = 3
swap(x, y)
println("$x, $y") // => 3, 5
lazyはなんだろ。。
こういう感じかな。
fun log(lazy message: String) {
if(isDebug) {
println(message)
}
}
log("${時間のかかる計算とか()}")
isDebugがfalseを返すときはmessageが使用されないので時間のかかる計算とか()が呼び出されずに済む、と。
おわりに
こうやってみるとバージョン1.0への道のりは長そうに感じます。 それから、実装はゆっくりでいいからせめてドキュメントには書いといてよと思う文法・機能もいくつかありますね。。 でもこれらが実装されたらKotlinは今以上にずっと魅力的な言語になるのではないかと思います!
ということで明日は@bina1204さんです。