0) 序
思い立って、"Kotlinでスマートフォン・クロスプラットフォーム開発"に入門中。
(=> タイトルとしては、長くてノイジーな気がするので、以後、"ことクロ")。
現時点では、Kotlin向けAndroidStudio環境構築のみ。
目指せ、Kotlin on RoboVM@iOS。 cf.Jetbrain社roboVMブログ
まずは、情報がwebに限られるKotlinに急がば回れで、慣れるていく。本日は、同じJVM言語仲間であり、AndroidStudio等のビルドツールGradleの記述言語であるGroovyとの比較で、Kotlinのクロージャ&Delegateを入門。
1) クロージャ
クロージャの使いどころが気になる時は。
KotlinもGroovyもJavascriptも同じようなクロージャ。必要に応じ、クロージャ入門記事を参照しつつ、クロージャってどんなときに使うの?をちら見。
個人的には、①やっつけで機能豊富な(豊富すぎる)関数を作る場合か、②便利で自由度の高い関数を作る場合か、その他か、といった程度に理解。
Kotlin
今風の言語でクロージャが使えるのは当たり前、ということか、有志のプログラミング言語Kotlin 解説では、
"Kotlinではクロージャ(Closure)を扱えます。つまり、ローカル関数などが、その外側の関数内で宣言されている変数の値を読み書きすることができます。"と、そっけない。
Kotlinでは、関数にはふつうの関数fun x(){...}と、リテラル関数 val x={...}があって、若干意味が異なる。
IntelliJ EAP15を使って試してみると、両者とも問題なくクロージャが使えた(関数の外の変数nの値を変更できている)。
文字列の扱いも当然お手のものだね:
Groovy
Groovyは必要に応じ学ぶ方針なので、チラ見で済ませてしまう:
GroovyのClosureを使ってみる
はい、rubyっぽく書けるとのことですね。
2) Delegate(s)
KotlinとGroovyとで意味合いが違う..模様。
委託・委任するといった意味の動詞delegate。英語としてはビックワードの類で、プログラミングの世界では、実装依存になりがちなUIライブラリなどでよく使われるターム。
Kotlinでは、Classのプロパティを初期化したくない時(とりあえずの値としてnullを入れるのが嫌な時など)に、Delegated Proptertyが使われる。nullを許容するJavaの世界と、Nullを排除するKotlinの世界の間を、lazyなDelegated Proptertyがとりもつ感じなのだろう。
Groovyでは、クロージャのスコープ把握の制御などに、キーワードdelegateが用いられている。
参考 [Groovy]クロージャのthis、owner、delegateについて
Kotlin
声に出して読みたいKotlinの後半を見るにいろいろな、Delegatesパターンがあるらしい。詳しくは後にKotlinでJavaのUIライブラリいじるときに探ることとする。
とりあえず、形名 by Delegates.notNullというパターンを実行してみる。このあたりの表現の補完はIDE便利
Groovy
クロージャの中では、暗黙的に使用できる変数delegateがある。GradleでのDSLにも使われている。build.gradleをがりがり書く場合には理解しておくべきなのだろう。
参考 "Groovyを知らない人のためのbuild.gradle読み書き入門"のこの部分。
そして、RxJava/RxAndroidでFRPなどの話になってくると、Groovyのdelegate入りクロージャがより重要になってくるんでしょうね。
参考 GroovyOnAndroidやRxJavaをやりたい人のための、Groovyのクロージャの書き方・使い方メモ
所感。と、Kotlin本!
AndroidStudio使う関係で、Groovyとの対比でKotlinを調べたが、やはり、言語としての歴史があるGroovyに比べ、Kotlin情報は少なめ。。Kotlin本はないわけだし・・・と思っていたところ、先行公開版(MEAP)として、"Kotlin in Action"が既に4章まで、出ていることを発見!・・11章が、"KOTLIN FOR ANDROID"。
まずは、"Kotlin in Action"の1章を読んでみる。