Elixir-aliases

提供:Dev Guides
移動先:案内検索

エリクサー-エイリアス

ソフトウェアの再利用を容易にするために、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

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

エイリアス

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

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

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

5

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

注意-エイリアスは大文字で始まる必要があります。

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

組み込みモジュールにアクセスするために、ストリングやタプルなどの組み込みモジュールの名前を他のモジュールのエイリアスとして指定する場合、 "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 は*マクロ*として定義されています。 このマクロはガードとして使用できます。 つまり、 Integer.is_odd を呼び出すには、Integerモジュールが必要です。

*require Integer* 関数を使用して、以下に示すようにプログラムを実行します。
require Integer
Integer.is_odd(3)

今回は、プログラムが実行され、 true として出力が生成されます。

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

インポート

*import* ディレクティブを使用して、完全修飾名を使用せずに他のモジュールの関数またはマクロに簡単にアクセスします。 たとえば、Listモジュールの *duplicate* 関数を数回使用する場合、単純にインポートできます。
import List, only: [duplicate: 2]

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

*import* ディレクティブは、*:macros *および*:functions *を*:only *に与えることもサポートしています。 たとえば、すべてのマクロをインポートするには、ユーザーが書くことができます-
import Integer, only: :macros

importもrequireおよびaliasディレクティブと同じように* Lexicallyスコープ*されていることに注意してください。 また、モジュールを「インポート」することも「必須」であることに注意してください*。

use

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

defmodule Example do
   use Feature, option: :value
end

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

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end
*use Module* は最初にモジュールを必要とし、次にModuleで *__ using __* マクロを呼び出します。 Elixirには優れたメタプログラミング機能があり、コンパイル時にコードを生成するマクロがあります。 上記のインスタンスで___using___マクロが呼び出され、ローカルコンテキストにコードが挿入されます。 ローカルコンテキストは、コンパイル時に_use macro_が呼び出された場所です。