2021/8/24(火)

Dart言語をちょっと学んだ。教科書は公式のlanguage-tour

基本的な型は

  • Int
  • Double
  • String
  • bool
  • List
  • Set
  • Map
  • Null

あたり。あとあるのは関数型とクラス型。enum型もある。

文字というかUnicodeのコードポイントを表すRune型と、あとなんかよくわからないSymbol型というのもあるっぽいが、多分そんなに重要ではなさそう。

型推論はあるが型はきっちりしている。C++畑で育ってJSでうんざりしている自分にとっては大分好感。ifの条件式の中とかで勝手に非boolをboolに変換したりもしないらしい。あー健全健全。キャストはas演算子。

ちょっと面白い点としては、コンストラクタとして普通のコンストラクタの他に名前付きコンストラクタがあるらしい。C++ではコンストラクタを複数作ろうと思ってとれる手段と言えばオーバーロードするくらいだったので、明示的に名前つけて複数定義できるというのはスマートなのかもしれない。

あとは関数に名前付き引数を使える。なかなかよさげ。ただちょっと微妙に思ったのが、非必須の引数の場合func({Int? arg})という書き方で、必須の引数の場合func({required Int arg})となるところ。requiredと?はどっちか片方でいいんじゃ?と感じた。まあ明示的という意味ではいいのかもしれんが。

例外処理が少し変わっている。onでキャッチするエラーを指定し、catchで引数として受け取るらしい。どっちか片方書けばよく、両方書くこともできる。多分実際のコードを見る方が早い。ちょっと気持ち悪く感じる。

catch節から再スローするときの構文はthrowではなくrethrowらしい。そこ分けるんだ。例外送出と上流への再スローは根本的に違うんですっていうのをはっきりさせるのはいいことなのかもしれない。自分は昔C++でthrow;という書き方を見てハマったことがある。

ラムダ式は(){}の形で定義する。C++みたいに[](){}という感じで[]が必要になったり、JSみたく()=>{}という感じで=>が必要になったりはしない。そう大した違いでもないが、知ってる言語の中では一等シンプルだ。

if-else-else if,for,while,do-while,break,continue,switchあたりの制御文は特に変なところもなし。C++と大した違いはない。

constとfinalが分けられているらしい。finalが初期化のみ動的な変数でありconstは完全なコンパイル時定数なので、C++になぞらえればconst→final, constexpr→constと思えば良さそう。ただしfinal型のListやMap,クラス型の場合、再代入は当然不可能だがその要素やメンバは変更できる。このへんJSのconstと同じノリを感じる。

Iterable,yieldあたりのサポートもある。ジェネレータ、ファンクタ、関数オブジェクト、まあ名前はどうでもいいが、その類は普通に行けそうだ。

あとクラス型にcallメソッドを実装すると関数オブジェクトっぽく扱えるっぽい。この辺のノリはPythonくさいな。operator()()を実装するC++とも本質的には違わないか。

抽象クラス型も当然サポートしている。abstract class構文で定義できるらしい。PHPのinterfaceとかRustの(あれはまた特殊だけど)traitみたいに「classとは全く別物ですよ~」みたいなノリとは少し違う方向性を感じる。ややC++っぽい?でもextendsとimplementsを分けてたりもするので、なんか間くらいをとっているようにも見える。

というかabstract classをextendもimplementもできるのはなんなんだ?interfaceの考え方ならabstract classのextendは要らないと思うが、abstract classで実装済みのメソッドを共有させることも出来るということか。

継承とは別にMixinもあるらしい。ややっこしいなあ。というか言語レベルでこう明示的にMixinをサポートしてるの、意外と初めて見るかも?見聞が狭いだけかもだが。PythonとかJSとかだと他の機能で無理やり実現する感じになるので、言語的にサポートした方が案外実際にはすっきりするのかもしれない。

ジェネリクス(C++で言うテンプレート)もサポートしている。ある程度型ががっちりしている言語だともはや常識か。割とすっきりした文法で書ける。

全体を見た感じとしては、現代的な言語らしくいい感じに全体にすっきりした文法とシステムだと思うが、クラス継承回りは若干ややこしいかもしれない。Pythonの「ある処理を書く方法は一つであるべきだ」的な視点から見ると微妙に機能過多に見えないこともないが、rubyほどではないかな、くらいに感じた。


胎界主を読んだ。ロシア国立感染症研究所編終了。フルーレティがどんどん可愛げ出していくの何?マルバスも登場して2週目で地団太踏み出すの何?ゆるすぎるだろ…

オセだけ全く存在級位落ちなかったな。一言もしゃべんなかったし。あの壁を一瞬突き破るだけじゃなくて力でこじ開けて維持もできるのやばすぎない?これより上がいるの悪魔勢力やばすぎでしょ。

そしてマルコキアスも最後までぶれねえな…存在級位クッソ低いのは間違いないんだけど人間臭すぎるし雑な行動ばっかしてるからむしろたましいの萌芽は感じるんだよな…

いい話…いい話かこれ?よくわかんないけどいい感じになったな…

そういえばフェンリルは?


「『進撃の巨人』と解剖学」を読み進めた。しばらく前に買って放置してたやつ。

ほとんどの筋肉(骨格筋)は複数の骨にまたがって付いているという話が紹介されていた。筋肉は骨と骨との位置関係を動かすアクチュエータなんだから一つの骨に付いててもそりゃ仕方ない。言われてみればそれはそうなんだけど目から鱗だった。これ知ってるだけで筋肉への理解が本当にがらっと変わりそう。

あとその原則に対する例外的な筋肉の話も面白かった。多くの筋肉が骨同士を繋いでいるために骨格筋に分類されるのと違い、顔の筋肉は骨と皮膚をつないでいるから「皮筋」に分類されるのだという。皮膚と筋肉ってどうつながってるんだろ。それ言ったら骨とどう繋がってるんだろうという方もよく分かんないけど。


Flutterをちょっと勉強している。Dart実際に書いてみるとconst周りでエラーが頻発した。C++でいう所のconstexprなんだからそりゃ厳しいよね…JSのconstの感覚が抜けきってないようだ。

StatefulWidgetがStatefulWidgetとStateで分けて書くようになっていて、どうしてこういう構造になっているのかちょっとよく分からない。なにがしかの必要性があってこうしてるのではあろうが。

Categories: