個人事業主になったので真面目にアウトプットしてみるブログ

フリーで顧客の会社に潜り込んでAndroidアプリつくって、とりあえず食っていけるようにアウトプットを増やしていくブログです。

Kotlinのletってなんじゃろ?(前編)

最近Kotlinの勉強していて、ちょっと難しいなと感じたことについて考えました。

今日はKotlinのスコープ関数の一つのletについて考えようと思います!

Kotlinのletについて調べる

letねーletってなんなんじゃろ? スコープ関数ってそもそもなんなん?

Kotlinの公式サイトでなんて書いとるんじゃろ?

Calls the specified function block with this value as its argument and returns its result.

Kotlin公式サイトより

えーとなんてなんて??

( ,,`・ω・´)ンンン?

( ,,`・ω・´)ンンン?

わからんー...(´・ω・`)

大賢者Google様にお力をお借りいたしますー!

この値を引数として指定されたファンクションブロックを呼び出し、その結果を返します。

( ,,`・ω・´)ンンンンンンン?

ファンクションブロック内の結果を返す何かの様じゃ...

val foo = bar.let { it.toString() } 

あーこれねこれ。fooはStringになっているって話よね。
itに入っとるのはbarで、このブロックの中で返された値がfooに入るってこと。
うん!知ってた!

うーん。

知りたいのそこじゃないんよねー。

letは何のためにあるの?

そこなんよねー。



Kotlinのletの生い立ちを考える

そうだletはどこから来たんだろう?
Kotlinのおにーちゃん(orおねーちゃん??)はScalaって話だよね?

でもScalaにはletそのものや、それに近いものないようだ。 けど検索しているとOCmalのlet...inLisp方言のSchemaのletが出てきた。

これはもしかして、こちらから来たものかも???

OCmalのlet

さがしとるとこんなコードがでてきた。

# let average a b =
    let sum = a +. b in
    sum /. 2.0;;
val average : float -> float -> float = <fun>

で、でた!let...in

これを見ると

let 関数の参照子 引数... = 
 let 変数名A = 変数に代入される値のための式 in
   変数名Aを使った式;;

結局averageという関数の参照子は引数a,bをとってinの後結果を返すって感じよね。

Kotlinだとこんな感じで書けるんかな?

val average: (Float, Float) -> Float =
            { a, b -> (a + b) / 2.0f }

さらにletの使い方をまねるとー?

val average: (Float, Float) -> Float =
        {
            a, b -> (a + b).let { sum -> sum / 2.0f }
        }

無理やりまねようとするとこんな感じになったんじゃが...。
なんか違う...もちろんIDE様からはこのあとむちゃくちゃ(a + b) / 2.0fに変更をもとめられた...

Kotlinのletが参考にされたのはOcmalじゃない??

Schemaのletは??

Schemaのlet
(define (average a b)
    (let ((sum (+ a b)))
        (/ sum 2.0)))

ううう…Clojureの勉強しているので僕はなんとなくわかるんじゃけど...みなさんわかる?
んーこれもなんかOCmalに似とる気がする。

結局Kotlinとその他のletはちょっと違うものなのかもしれんね...。

多分Kotlinはオブジェクト指向言語的な振る舞いもするから、ここら辺の言語とは違うんかもしれん...。

次回はオブジェクト指向的な視点からみたletについて考えようと思います。