Sigils
Elixirでは、正規表現を書くときに ~r/neko/ と書きます。その ~r の書き方箇所のバリエーションや、 ~w 、 ~W などのword list、カスタムsigilsの作り方が書いていました。Rubyでも%wといったものをよく使うので、こちらも使いそうですね。
try, catch and rescueの使い方
In Elixir, we avoid using try/rescue because we don’t use errors for control flow. We take errors literally: they are reserved to unexpected and/or exceptional situations. In case you actually need flow control constructs, throws should be used. That’s what we are going to see next.
Elixirでは、try/rescueの形をあまり使わないらしいです。というのも、エラーを制御の流れ等して使わないという立ち位置だそうな。このerrorは本当にunexpectedな状態、というふうに捉えるそう。
もし想定したエラー処理を行う場合、throw/catchを使う模様。この中で、特定の値を探す、というようなよくある処理は Enum.find/2 として関数が用意もされている模様。
Elixirで、processが自然な状態で死んだ場合、 exit を送るらしいです。なので、このexitをtry/catchして何か処理を行う、というのもされます。
この exit はErlang VMで、fault tolerant systemとして重要な位置を占めるらしい。supervision tree配下のプロセスがこのexitを送ったら、そのプロセスは再起動されるらしいです。これにより、素早く落ちて立ち直る、ということができるのですね。なので、try/catchやtry/rescueよりもexitを積極的に使うと。あと、何かのあとに必ず実行するために、 try/after が用意されています。
Typespecs and behaviours
@spec でspecificationを定義して、その下側でdefで定義する。 @type で @type number_with_offense :: {number, String.t} のようにすることで、カスタム型を定義して使い回すことが可能。と。
Behaviourの説明もあるのですが、英国英語ってのが何気に趣がありますね。
defmodule Parser do use Behaviour defcallback parse(String.t) :: any defcallback extensions() :: [String.t] end
のように定義されたBehaviourは、
defmodule Neko do @behaviour Parser def parse(str), do: # ... parse JSON def extensions, do: ["json"] end
のように定義することができる。
そしてMix and OPTへ…