useimport 有什么区别?



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



看起来一个区别是 import 让我们选择特定的函数/宏,而 use 则包含所有内容。

还有其他区别吗?你什么时候会使用一个?

最佳答案

import Module Module 的所有函数和宏带入您的模块。

require Module 允许您使用 Module 的宏,但不导入它们。 (Module 的函数总是可用的命名空间。)

use Module 第一个 requires 模块然后调用 0x2518122313431423111 上的 0x2518122313431421 宏。

考虑以下:

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

这不会编译,因为 __using__ 尚未导入 Module

以下将编译:

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

当您 ModA.moda() d ModB 时,它生成了一个 use 语句,该语句被插入到 ModA 中。

关于Elixir:使用 vs 导入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28491306/

10-15 23:19