inline fun
その名の通りインライン展開される関数です。
インライン展開とは?
fun caller() { a() callee() d() } fun callee() { b() c() }
通常、関数呼び出しは関数呼び出しにコンパイルされます (???)
JVMの場合はINVOKEVIRTUALというオペコードに変換されます。
ところがインライン展開されると、 関数呼び出しを行わずに関数の中身をコピーするようなバイナリが生成されるんですね。
fun caller() { a() b() c() d() }
このインライン展開、他言語ではプログラマがわざわざ明示しなくてもよしなにやってくれるのですが Kotlinのコンパイラはあまり積極的に行ってくれません。 あまり最適化を行わずProGuardなどの最適化にまかせる方針っぽいです。
JVMのクラスファイルを他言語のLLVMと同じようなものとして利用しているんですね。 実際にProGuardはこういった関数のインライン展開を行うことができます。
さて、もうお分かりかと思いますが、 Kotlinのinline funという言語仕様は最適化が目的ではありません。
続きを読むクロージャ
関数の中に関数を書くことができます。
fun outer() { fun inner() { } }
通常の関数
fun inner() { }
匿名関数
val inner = fun() { }
val inner = { }
記法はいくつかあれど、Kotlinの場合関数の中に書く関数はすべてクロージャとなります。
つまり内側の関数は外側の関数にあるローカル変数へのアクセスが可能です。
fun enclosure() { val localVariable = 42 fun closure1(): Int { return localVariable + 1 } val closure2 = fun(): Int { return localVariable + 1 } val closure3: () -> Int = { localVariable + 1 } }
このキャプチャを実現している手法についてです
続きを読むインデントにスペース3文字を使う
あくまで個人プロジェクトでの話です。
チームでの開発などではチームに合わせましょう
あとこのエントリに限らずすべてそうですがあくまで私がそうしているというだけであって 他の人に強要する気はありません。
正直たまに理解不能なことを言ってる自覚はありますし
というわけでインデントにはスペース3文字を使いましょう。
理由はいたってシンプル、2文字じゃ少なすぎる、4文字じゃ多すぎる、
じゃあ3文字にすればいいやんけということです。
何年か3文字でやってきてますけどとくに問題なくいけてますね。
タブ文字を嫌う理由はとくにないのですが 強いて言えば下記のふたつ。
インデントが深くなればなるほどそれに比例して環境ごとの差異が大きくなる。
一行が長くなってきたときにほどよく改行することになるんですけどその位置も環境に依存してしまう。縦のラインを揃えるときにタブ文字とスペースが混在する。
hull() { // v ここはスペース translate([x, y, z ]) cube([w(z ), h, 0.1]); // ^ ここはスペース translate([x, y, z + step]) cube([w(z + step), h, 0.1); // ^ ここはタブ }
縦のラインを揃えること自体の是非についてはまたいつか書きます
論理的に思考する
誰だって自分や自分の好きなものが正しいと思いたいものです。
だからといってそういう思考ばかりしていてはいけないんですね。 人が成長するきっかけは大きく2つあると私は考えています。 ひとつは、それまで知らなかった新しい知識を身につけること。もうひとつは、間違って覚えていた知識を改めることです。 そのひとつを自ら閉ざすというのはもったいないことです。
もっとわかりやすく言えば、自分が間違っているにも関わらず「自分は正しい!」なんて考えている人は、よほどなんらかのきっかけがない限り間違いに気づかず間違い続けるというわけです。
ですから、自分が間違っている可能性を考える、自分と違う意見を頭ごなしに否定しない、これが非常に大事になってくるんですね。
そもそも、自分の好きな人のやることが全て正しくて自分の気に入らない人のやることは全て間違っているなんていうことは、常識的に考えればあり得ない話です。 自分自身や周りの人、ひいては社会全体を良い方向に向かわせていくためには、やはり私情や感情論で思考することをなるべく避けて、中立の立場から論理的に考察する癖をつけていくべきではないかなと思います。