2017/06/26 このエントリーをはてなブックマークに追加 はてなブックマーク - Kotlinの演算子オーバーロードはnullableが絡むと少しめんどい

Kotlinの演算子オーバーロードはnullableが絡むと少しめんどい

カテゴリ:


つまりこういうめんどくささがあります。


val f1 : () -> Unit = {}
f1() f.invoke() // OK
val f2 : (() -> Unit)? = null
f2() //コンパイルエラー 
f2?.invoke()  // OK

nullableをレシーバーに取りにくい


f1()という関数呼び出しは、実は演算子オーバーロードという機能によって実現しています。
f1()とコードを書いた時 f.invoke() が呼び出されるというものです。
f1は () -> Unit 、つまり引数なしでUnitを返す関数型をlambdaで表現したものですが
実体の型はFunction0<Unit> というインターフェースです。

Function0の実装はこうなっています。

// kotlin.jvm.functions
// Functions.kt 
public interface Function0 <out R > : Function<R> {
    /* Invokes the function. */     
    public operator fun invoke(): R
}

f1はFunction0自身であり、invokeが実行されます。
これがf2のようにnullableとなった場合にKotlinの演算子オーバーロードはそれを許しません。
f2?.invokeという風に厳密にかけとコンパイルエラーになります。

つまり、nullableな変数の関数呼び出し(nullableな型をレシーバーとする関数呼び出し)をしにくいということです。


前述したコードのf2を、f2?()とかって実行出来れば良いのではという感じもしますが、
Kotlinはそういった言語設計を行っていないようです。
f2?()という呼び出しをサポートする代わりに明示的にf2?.invoke()と書きなさい、としています。
これはnull安全的観点で言うと良いような気もしますが、
突然普段は演算子オーバーロードによって隠蔽されているinvokeという謎関数が出てきた感じになるので、実装者としては混乱するかもしれません。

推測ですが、f2?()とかという書き方をサポートしなかったのは
単純に?を使った記法を利用できる箇所を限定的にしたかったのと、
コンパイラの字句解析とかを簡単にしたい(めんどい)というのがあったのではないかと思います。



nullableだと演算子オーバーロードが利用できないかというとそうではありません。
拡張関数を利用すれば良いのです。
たとえば次のように実装すればinvokeの呼び出しも演算子オーバーロードを介して利用可能です。

operator fun <R> Function0<R> ?.invoke() = this?.invoke()

val f2 : (() -> Unit)? = null 
f2() // コンパイル通る

ただし、Kotlinの標準ライブラリとしてわざわざこういった機能を提供せず
f2?.invoke()と書かせているのは、関数を実行したつもりで関数を実行していないなどのバグの元になるのを防ぐといった意図がありそうですしあまりお勧め出来るソリューションではありません。


もう一つ、理由として考えるられるのは
nullableなものを実行した時の対処というのは大体においてコーディングしている側に委ねられるものだと思います。
たとえばBigDecimal + BigDecimal で返されるのは2つのインスタンスの値を加算したものであるのは自明という感じがしますが
BigDecimal? + BigDecimal
BigDecimal? + BigDecimal?
などは何を返すかはちょっと考える必要があります。
あと、単純に標準ライブラリが膨らみますね。


  • 演算子オーバーロードはnullableをレシーバーにとる時の挙動はあんまりサポートしていない
  • どうしてもやりたいなら実装者側で拡張関数で追加していく必要がある

悪ふざけコードです。


https://gist.github.com/yyYank/02d6c7f64532bb30cd0e63563d90feb2




2017/06/04 このエントリーをはてなブックマークに追加 はてなブックマーク - Kotlin入門までの助走読本の個人的な裏話

Kotlin入門までの助走読本の個人的な裏話

カテゴリ: ,

Kotlin入門までの助走読本というfree bookを
僕も参加させてもらって、ちょっと書きました。
楽しかったなぁー。皆さんありがとうございました。

ぜひ読んだ方はアンケートも書いてみて下さい。ありがたく拝見します。

https://t.co/uaFHHfiLuh


あくまで個人的な感想&意見という感じですが、裏話としてブログを書いてみます。

2017/05/26 このエントリーをはてなブックマークに追加 はてなブックマーク - Kotlinという言語とNull Safety

Kotlinという言語とNull Safety

カテゴリ:

何も考えずタイトルつけたのに胡散臭い。


どうも、趣味でKotlinの情報を集めてるだけの人です。


KotlinはAndroidで公式採用されることが決まりまして特需が出てきています。



こぞって企業がPRのために「Kotlin使ってますアピール」をしたり、
Kotlinとはなんぞや、みたいな話を書いたりとかしてますので、
この速さなら言える、ということで僕も便乗して久しぶりにKotlinの話を書こうと思います。


プログラミング言語は簡単で、それを難しく語る人や難しく使う人がいるというだけな気がしています。

つまり何が言いたいかというとKotlinは簡単です。あと、ラクです。

僕が今日書こうとしているのはよく分からないボヤキなので単純に学びたいというだけであれば、
Kotlin KoansKotlinの公式サイトのリファレンスだけ見れば大体充分です。

他の情報はまぁ、あんまり読んでも読まなくても一緒です。(というとアレですね。。)



あ、でもKotlinスタートブックという本は良いです。

あと、僕のサイトも使ってみてね(宣伝)
逆引きKotlin



それだけで良いと思うのでココから先は読まなくても問題ないです。


2017/05/21 このエントリーをはてなブックマークに追加 はてなブックマーク - 参加と発表しました(JJUG CCC Spring 2017)

参加と発表しました(JJUG CCC Spring 2017)

カテゴリ: , , ,

タイトルかぶりしそうなので変なタイトル。

VMの歩む道。とか言ってHotSpot VMとDalvikとARTの話をしました。
https://www.slideshare.net/yyyank/vm-dalvikartjava-vm


発表者の理解不足もかなりあって、資料見ていただくと簡潔でなかったり
情報として微妙だったりする箇所も多いと思います。
それでも勉強になったと言ってくれる人もいてありがたいです。
(
  ホントはJVMS全部読んで
  ARTとかOpenJDKの実装ももう少し読んだ上で発表したかった。
  JVMSはJava SE8版でPDFだと600ページぐらいです
  (注意:pdf) The Java® Virtual Machine Specification
)


ベスト尽くしてこんな感じです。すみません。


訴訟の問題、パフォーマンスチューニングを発表スコープから削ったことで
大分説明しやすいかと思ったんですけど、 それでも広いなとか思いました。



JITとかAOTとかめちゃくちゃ簡単に説明しましたが
プロファイリングした上でその情報に基づいてJITが走ったりするとか色々あるんですけど、
あー、どこまで調べよう&説明しようかみたいな感じでした。


今回はあまり質問なかったか、しにくかったのかもしれません。

後から話しかけに来てくれる人もいたのでその人からは色々意見聞くことが出来ました。

さくらばさんのJigsawセッションを拝聴して
sli.doという匿名質問サービスが良さそうなのでまた機会があれば使ってみたいなと思いました(さくらばさんがツッコまれる世界を初めて見たw)。

https://www.sli.do/



データモデル、勉強になりました。咄嗟に出てくるようにしたいなとか思います。いっつもデータモデルのこういうものがあると思いつつも、どのタイミングでそれを使うべきかとか適切に判断できずじまいということが多いです。

  • Javaエンジニアに知って欲しいRDBアンチパターン

色々ためになる内容だったんですけど、アンチパターンはH2Oぐらいに思い出がいっぱいって感じなので素直に笑えなかったです。そーだいさんぐらい声が通る感じになりたい。

さくらばさんのセッションはいつも安定感がすごいです。たしか、全然スライドとか見ずに全部覚えてて話してるとかいう噂を何処かで聞いた気がします。Jigsawに関してはモジュールがうんたらーで最近もめてるやつってぐらいしか把握できてなかったので、勉強になりました。
以下、なんかツイートしてたやつ





きしださんぽいなぁと思いました。前半は難しいというか全然知らない分野で雰囲気で聞きました。コーディングのベストプラクティスの部分は納得出来る内容が多かったです。


LINEさんの寿司ちょっと食べましたが美味しかったです。

色々勉強できたし、色んな人と話せたし良かったです。
今回もありがとうございました!みなさんお疲れ様でした!




2017/04/10 このエントリーをはてなブックマークに追加 はてなブックマーク - 「イシューからはじめよ」はシステム開発、プレゼンで役立つ内容かもしれない

「イシューからはじめよ」はシステム開発、プレゼンで役立つ内容かもしれない

カテゴリ:


「イシューからはじめよ」を読んだ。結構良かった。


別にソフトウェア開発とかそっち系ではなく、
もっと仕事をする人全般に当てはまる内容の本。

だけど、自分として役立ちそうなのものとして

  • システム開発
  • トラブルシューティング
  • 勉強会とかの発表

という場面が思い浮かんだ。
なのでシステム開発で「開発が終わらない」とか「バグの解析が苦手」とか、
勉強会で「プレゼンの資料が上手く作れない」とか悩んだりしてる人は読むといいのかもしれない。












GA