模块属性
@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或者 元组 {__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, 参数是模块名或者元组{
- 模块环境变量
- 类型: :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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。