1. ホーム
  2. elixir

[解決済み] Elixir: useとimportの違い

2022-04-27 13:36:19

質問

とはどう違うのですか? useimport ?

use は、与えられたモジュールを現在のコンテキストで使用するためのシンプルなメカニズムです。

https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2

他のモジュールから関数やマクロをインポートする

一つ違うようです。 import は、特定の関数/マクロを選ぶことができるのに対して use はすべてを取り込みます。

他に違いはありますか?どのような場合にどちらを使うのでしょうか?

解決方法は?

import Module のすべての関数とマクロをもたらします。 Module を名前なしであなたのモジュールに取り込みます。

require Module のマクロを使用することができます。 Module が、インポートされません。(関数 Module は常に名前空間的に利用可能です)。

use Module 第一 requires モジュールを呼び出し、その後に __using__ マクロを Module .

次のように考える。

defmodule ModA do
  defmacro __using__(_opts) do
    IO.puts "You are USING ModA"
  end

  def moda() do
    IO.puts "Inside ModA"
  end
end

defmodule ModB do
  use ModA

  def modb() do
    IO.puts "Inside ModB"
    moda()     # <- ModA was not imported, this function doesn't exist
  end
end

としてコンパイルされません。 ModA.moda() にインポートされていません。 ModB .

以下はコンパイルされますが。

defmodule ModA do
  defmacro __using__(_opts) do
    IO.puts "You are USING ModA"
    quote do          # <--
      import ModA     # <--
    end               # <--
  end

  def moda() do
    IO.puts "Inside ModA"
  end
end

defmodule ModB do
  use ModA

  def modb() do
    IO.puts "Inside ModB"
    moda()            # <-- all good now
  end
end

のときのように use d ModA を生成していました。 import の中に挿入されたステートメントは ModB .