エリクサー-エイリアス

ソフトウェアの再利用を容易にするために、Elixirは3つのディレクティブを提供します– alias, require そして import。また、以下に要約されているuseと呼ばれるマクロも提供します。

# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar

# Ensure the module is compiled and available (usually for macros)
require Foo

# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo

# Invokes the custom code defined in Foo as an extension point
use Foo

ここで、各ディレクティブについて詳しく理解しましょう。

エイリアス

aliasディレクティブを使用すると、任意のモジュール名のエイリアスを設定できます。たとえば、エイリアスを付けたい場合'Str' Stringモジュールに、次のように書くことができます。

alias String, as: Str
IO.puts(Str.length("Hello"))

上記のプログラムは次の結果を生成します-

5

エイリアスが与えられます String モジュールとして Str。これで、Strリテラルを使用して関数を呼び出すと、実際にはStringモジュール。これは、非常に長いモジュール名を使用していて、現在のスコープでそれらを短いモジュール名に置き換えたい場合に非常に役立ちます。

NOTE −エイリアス MUST 大文字で始めます。

エイリアスは、 lexical scope それらは呼び出されます。たとえば、ファイルに2つのモジュールがあり、いずれかのモジュール内にエイリアスを作成した場合、そのエイリアスは2番目のモジュールではアクセスできません。

組み込みモジュールにアクセスするために、StringやTupleなどの組み込みモジュールの名前を他のモジュールのエイリアスとして指定する場合は、その前に追加する必要があります。 "Elixir."。例えば、

alias List, as: String
#Now when we use String we are actually using List.
#To use the string module: 
IO.puts(Elixir.String.length("Hello"))

上記のプログラムを実行すると、次の結果が生成されます-

5

必要とする

Elixirは、メタプログラミング(コードを生成するコードの記述)のメカニズムとしてマクロを提供します。

マクロは、コンパイル時に実行および展開されるコードのチャンクです。つまり、マクロを使用するには、コンパイル中にそのモジュールと実装が使用可能であることを保証する必要があります。これはで行われますrequire 指令。

Integer.is_odd(3)

上記のプログラムを実行すると、次の結果が生成されます-

** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1

Elixirでは、 Integer.is_odd として定義されています macro。このマクロはガードとして使用できます。これは、呼び出すために、Integer.is_odd、整数モジュールが必要になります。

使用 require Integer 機能し、以下に示すようにプログラムを実行します。

require Integer
Integer.is_odd(3)

今回はプログラムが実行され、次のように出力が生成されます。 true

一般に、モジュールで使用可能なマクロを使用する場合を除いて、使用前にモジュールは必要ありません。ロードされていないマクロを呼び出そうとすると、エラーが発生します。エイリアスディレクティブと同様に、requireも字句スコープであることに注意してください。マクロについては、後の章で詳しく説明します。

インポート

私たちは使用します import完全修飾名を使用せずに、他のモジュールから関数またはマクロに簡単にアクセスするためのディレクティブ。たとえば、使用したい場合duplicate Listモジュールから関数を数回取得すると、単純にインポートできます。

import List, only: [duplicate: 2]

この場合、Listから重複する関数(引数リストの長さ2)のみをインポートしています。でも:only はオプションです。名前空間内の特定のモジュールのすべての関数をインポートしないようにするために、その使用をお勧めします。 :except 関数のリストを除くすべてをモジュールにインポートするためのオプションとして指定することもできます。

ザ・ import ディレクティブもサポートします :macros そして :functions 与えられる :only。たとえば、すべてのマクロをインポートするには、ユーザーは次のように記述できます。

import Integer, only: :macros

インポートも Lexically scopedrequireおよびaliasディレクティブと同じです。また、注意してください'import'ing a module also 'require's it

使用する

指令ではありませんが、 use に密接に関連するマクロです requireこれにより、現在のコンテキストでモジュールを使用できます。useマクロは、外部機能を現在の字句スコープ(多くの場合モジュール)に取り込むために開発者によって頻繁に使用されます。例を通してuseディレクティブを理解しましょう-

defmodule Example do 
   use Feature, option: :value 
end

使用は、上記を-に変換するマクロです。

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end

ザ・ use Module 最初にモジュールが必要で、次に呼び出します __using__モジュール上のマクロ。Elixirには優れたメタプログラミング機能があり、コンパイル時にコードを生成するマクロがあります。_ _using__マクロは、上記の例では呼ばれ、そしてコードは我々のローカルコンテキストに注入されます。ローカルコンテキストは、コンパイル時にuseマクロが呼び出された場所です。