Elixir 模块属性

更新于 2014-07-01  约 6 分钟

Module Package Docs

模块属性

@after_compile

编译后hook, 后边加的参数是 模块名或者元组{<module>, <function atom>},如果是使用元组{<module>, <function atom>}作为参数,函数参数是模块的环境变量和字节码(bytecode), 如果仅是模块名,after_compile hook 会调用模块的__after_compile__/2函数。

例子

defmodule M do
  @after_compile __MODULE__

  def __after_compile__(env, _bytecode) do
    IO.inspect env
  end
end

@before_compile

在模块编译这前的hook, 参数是module或者 元组 {, <function/macro atom>},如果参数只是模块名则调用__before_compile__/1 函数或者宏。函数或宏接受module的环境变量(ENV)作为参数。和@after_compile不一样的是
回调函数必须是另一个模块内,因为在编译时当前模块还不存在。

例子:

defmodule A do
  defmacro __before_compile__(_env) do
    quote do
      def hello, do: "world"
    end
  end
end

defmodule B do
  @before_compile A
end

@behaviour

定义otp的行为模式

defmodule M do
  @behaviour gen_event

  # ...
end

@compile

设置编译参数。

defmodule M do
  @compile {:inline, myfun: 1}

  def myfun(arg) do
    to_string(arg)
  end
end

@doc

设置函数或者宏的文档,可以是string或heredoc或false

  defmodule M do
    @doc "Hello world"
    def hello do
      "world"
    end

    @doc """
    Sum.
    """
    def sum(a, b) do
      a + b
    end
  end

@file

设置stack traces显示文件信息。参数是string

  defmodule M do
    @doc "Hello world"
    @file "hello.ex"
    def hello do
      "world"
    end
  end

@moduledoc

模块文档

  defmodule M do
    @moduledoc """
    A very useful module
    """
  end

@on_definition

用于当前模块的函数或者宏定义时调用hook, 参数是模块名或者元组{, }. 函数接受6个参数:

  • 模块环境变量
  • 类型: :def, :defp, :defmacro, or :defmacrop
  • function/macro 名字
  • 参数列表
  • 函数guard列表

@on_definition 只会调用函数,不会调用宏,即@on_definition 的 参数是函数。
未指定函数时, 会 调用__on_definition__/6函数。

  defmodule H do
    def on_def(_env, kind, name, args, guards, body) do
      IO.puts "Defining #{kind} named #{name} with args:"
      IO.inspect args
      IO.puts "and guards"
      IO.inspect guards
      IO.puts "and body"
      IO.puts Macro.to_string(body)
    end
  end

  defmodule M do
    @on_definition {H, :on_def}

    def hello(arg) when is_binary(arg) or is_list(arg) do
      "Hello" <> to_string(arg)
    end

    def hello(_) do
      :ok
    end
  end

@on_load

模块加载时调用 hook, 参数是当前模块中函数的函数名(atom)。 设置的函数不能有参数,返回值是:ok,否则模块会被忽略。

 defmodule M do
    @on_load :load_check

    def load_check do
      if some_condition() do
        :ok
      else
        nil
      end
    end

    def some_condition do
      false
    end
 end

@vsn

设置模块版本

defmodule M do
  @vsn "1.0"
end
阅读 3.7k更新于 2014-07-01

推荐阅读
lidashuang's note
用户专栏

Happy Hacking

11 人关注
63 篇文章
专栏主页
目录