José Valim氏が先日発表したElixir 1.3では,命令型の代入が廃止され,新たな型とアクセサが追加された。ビルドツールのMixと,ユニットテストフレームワークのExUnitにも改良が加えられている。
Elixir 1.3では,外部スコープからアクセスされる変数に対する命令型の代入が非推奨機能となった。このような記述が検出されると,毎回,警告が出力される。その背景には,外部スコープで使用される変数への代入は内部スコープに暗黙の戻り値を追加するのに等しい,という論理的な根拠がある。次にあげた関数定義はその一例だ。
def format(message, opts) do
path =
if (file = opts[:file]) && (line = opts[:line]) do
relative = Path.relative_to_cwd(file)
message = Exception.format_file_line(relative, line) <> " " <> message
relative
end
{path, message}
end
このif
ブロックはpath
に値を返すと同時にmessage
の値も更新して,それを囲む関数からpath
とともに戻している。Elixir 1.3はこれを悪い使用例と解釈して,if
ブロックが明示的に2つの値を返す,次のようなコードへのリファクタリングを要求する。
def format(message, opts) do
path =
if (file = opts[:file]) && (line = opts[:line]) do
relative = Path.relative_to_cwd(file)
message = Exception.format_file_line(relative, line) <> " " <> message
{relative, message}
end
{path, message}
end
記述を簡素化するためのもうひとつの言語機能である,新たなアクセスセレクタは,ネストしたデータ構造をトラバースするためのものだ。次のスニペットは,language
キーに関連付けられたmapを埋め込んだmapをトラバースして,name
キーのすべての要素を大文字(upcase)に変換する方法を示している。
iex> update_in myMap, [:languages, Access.all(), :name], &String.upcase/1
ElixirのビルドツールであるMixでは,クロスリファレンスチェックが可能になった。 存在しないモジュールや関数の呼び出しの検出や,特定のモジュールに属する関数に対するすべての呼び出しの検索,依存グラフの作成などに利用することができる。出力される内容も整理され, 警告が見つけやすくなった。さらにElixir 1.3のMixでは依存性追跡についても改良されており,コンパイル時間の短縮となって現れている。
ElixirのユニットテストフレームワークであるExUnitには,Mixのクロスリファレンスチェックを利用する--stale
フラグが新たに加えられて,最後の実行時以降に変更されたユニットテストのみを実行することが可能になった。ExUnit
には他にも,アサーション出力や名前付きブロックを使用したテストの構造化などが改良されている。
Elixir 1.3の変更点は他にも多数あり,リリースノートにその全内容が記載されている。
この記事を評価
- 編集者評
- 編集長アクション