同じプロジェクト内の異なるElixirモジュール間でコードを共有するには、外部のモジュールをそのフルネームで参照する必要があります。でも、その名前が長すぎたり紛らわしかったりしたらどうでしょう?
特殊形式のaliasを使うと、外部モジュールを参照するときの名前を短くしたり変更したりできます。引数なしで使うと、モジュール名は最後の部分だけに切り詰められます。たとえば、MyApp.Logger.SettingsはSettingsになります。:asオプションを使えば、独自の名前を指定できます。
通常、エイリアスはモジュール定義の先頭に追加します。
defmodule Square do
alias Integer, as: I
def area(a), do: I.pow(a, 2)
end
特殊形式のimportを使うと、外部モジュールの名前を使わずに、そのモジュールの関数を利用できます。
外部モジュール全体をインポートすると、既存のローカル関数と衝突する可能性があります。これを避けるには、:exceptと:onlyの2つのオプションがあります。どちらもキーワードリストを想定しており、キーは関数名、値はその関数のアリティです。
通常、インポートはモジュール定義の先頭に追加します。
defmodule Square do
import Integer, only: [pow: 2]
def area(a), do: pow(a, 2)
end
最近買ったあのラジコンカーが、すっかり新しい趣味になりましたね。ラジコンカーのレースを開催しています。
レースのシミュレーションを実行できるプログラムを、もう少しで書き終えるところでした。ところが、猫がキーボードに飛びついて、コードを数行消してしまいました。そのせいで、プログラムがコンパイルできなくなってしまいました…
Race.__struct__/0 is undefinedを修正するモジュールNeedForSpeed.Raceを、より短い名前Raceで参照できるように、エイリアスを追加してください。
Car.__struct__/0 is undefinedを修正するモジュールNeedForSpeed.RemoteControlCarを、より短い名前Carで参照できるように、エイリアスを追加してください。
undefined function puts/1を修正する関数puts/1は、モジュールIOで定義されています。モジュールを参照せずに使えるように、インポートしてください。
undefined function default_color/0を修正する関数default_color/0・red/0・cyan/0・green/0は、いずれもモジュールIO.ANSIで定義されています。ほかの車の色にも対応させたいと考えているので、モジュール全体をインポートしたいところです。残念ながら、モジュールIO.ANSIの関数color/1は、ローカルで定義した関数の1つと衝突します。その1つの関数を除いて、IO.ANSIモジュール全体をインポートしてください。