Let it be

11月6日火曜日、雨

朝から夕方まで、雨。

ここのところ2時間おきに10分程度の散歩を挟むようにしているのだけれど、雨の中を出るのは少々キツかった。(でも出た。こういうところ、意地でも決めたことはやめないという融通の利かなさは僕の悪いところで、そしてたぶんいいところでもあるんだとおもう)

* * *

ところで唐突だけれどプログラミング言語の Kotlin の話。

Kotlin には、オブジェクトにブロックを伴う let 式がある。

anObject.let { ... }

みたいに書く。

Kotlin の「ブロック」は実のところ「無名関数」。

anObject.let { x -> ... }

無名関数は Kotlin でも以下のように JavaScript などでおなじみの「関数」らしい関数のようにも書ける。

fun(x: Type) {
  /* function body */
}

そして何がどうしてそうなったか、この無名関数の引数を波括弧の中に入れることができる。つまり

{ x: Type -> /* function body */ }

そして Kotlin は、かなり賢く型推論をしてくれるので「: Type」の型指定を省略することが(大抵の場合)できて、結果「{ x -> ... }」のような無名関数ができあがる。

いまは無名関数の引数名を x としたけれど、ブロックとする場合省略できて、そのときは it という名前が採用される。結果、

anObject.let { AnotherObject(it) }

のような書き方ができる。
言い忘れたけれど、ブロックの末尾の式がブロックの値、無名関数の戻り値になる。また Kotlin では new キーワードなしにオブジェクトが生成されるので、先の「AnotherObject(it)」は Java で言い換えると「new AnotherObject(anObject)」と書いたことに等しい。

(ここまでグダグダ書いてきて、書きたかったことがなんだかボケてしまって今、けっこう凹んでいる)

ええと、なにが言いたかったかというと、この let 構文って

let anObject be ...

と書いているように見える、ってことです。

実際「anObject.let { AnotherObject(it) }」と書けば anObject を引数に AnotherObject を構築したことになるので、「anObject よ AnotherObject になあれ!」みたいな感じに。

そしてそのまま . でつないで AnotherObject として処理を継続できる。

楽しいんです。

この記事が気に入ったらサポートをしてみませんか?