Elixir语言中 Kernel.use
相关用法介绍如下。
用法:
use(module, opts \\ [])
(宏)
在当前上下文中使用给定的模块。
调用时:
use MyModule, some: :options
调用MyModule
模块中的__using__/1
宏,将传递给use
的第二个参数作为其参数。由于__using__/1
是一个宏,所有常用的宏规则都适用,并且它的返回值应该是引用的代码,然后插入到调用
的地方。use/2
例子
例如,要使用 Elixir 提供的
框架编写测试用例,开发人员应该 ExUnit
use
模块:ExUnit.Case
defmodule AssertionTest do
use ExUnit.Case, async: true
test "always pass" do
assert true
end
end
在此示例中,Elixir 将调用
模块中的 ExUnit.Case
__using__/1
宏,并将关键字列表 [async: true]
作为其参数。
换句话说,
转换为:use/2
defmodule AssertionTest do
require ExUnit.Case
ExUnit.Case.__using__(async: true)
test "always pass" do
assert true
end
end
其中
定义ExUnit.Case
__using__/1
宏:
defmodule ExUnit.Case do
defmacro __using__(opts) do
# do something with opts
quote do
# return some code to inject in the caller
end
end
end
最佳实践
__using__/1
通常在需要将某些状态(通过模块属性)或回调(如 @before_compile
,请参阅
的文档以获取更多信息)设置到调用者时使用。Module
__using__/1
也可用于别名、要求或导入来自不同模块的函数:
defmodule MyModule do
defmacro __using__(_opts) do
quote do
import MyModule.Foo
import MyModule.Bar
import MyModule.Baz
alias MyModule.Repo
end
end
end
但是,如果 __using__/1
所做的只是导入、别名或要求模块本身,则不要提供。例如,避免这种情况:
defmodule MyModule do
defmacro __using__(_opts) do
quote do
import MyModule
end
end
end
在这种情况下,开发人员应该直接导入或别名模块,以便他们可以根据需要自定义这些模块,而不需要
后面的间接。use/2
最后,开发人员还应避免在 __using__/1
回调中定义函数,除非这些函数是先前定义的 @callback
的默认实现,或者是要被覆盖的函数(参见
)。即使在这些情况下,定义函数也应视为"last resort"。defoverridable/1
如果您想为用户模块提供一些现有函数,请将其定义在将相应导入的模块中;例如,
没有在调用 ExUnit.Case
use ExUnit.Case
的模块中定义 test/3
宏,但它定义了
并在使用时将其导入调用者。ExUnit.Case.test/3
相关用法
- Elixir Kernel.unless用法及代码示例
- Elixir Kernel.update_in用法及代码示例
- Elixir Kernel.SpecialForms.case用法及代码示例
- Elixir Kernel.round用法及代码示例
- Elixir Kernel.left / right用法及代码示例
- Elixir Kernel.put_in用法及代码示例
- Elixir Kernel.tl用法及代码示例
- Elixir Kernel.left - right用法及代码示例
- Elixir Kernel.tuple_size用法及代码示例
- Elixir Kernel.defexception用法及代码示例
- Elixir Kernel.to_charlist用法及代码示例
- Elixir Kernel.base ** exponent用法及代码示例
- Elixir Kernel.left !== right用法及代码示例
- Elixir Kernel.if用法及代码示例
- Elixir Kernel.spawn_monitor用法及代码示例
- Elixir Kernel.to_string用法及代码示例
- Elixir Kernel.length用法及代码示例
- Elixir Kernel.first..last用法及代码示例
- Elixir Kernel.SpecialForms.%{}用法及代码示例
- Elixir Kernel.SpecialForms.for用法及代码示例
- Elixir Kernel.then用法及代码示例
- Elixir Kernel.spawn用法及代码示例
- Elixir Kernel.defmodule用法及代码示例
- Elixir Kernel.SpecialForms.quote用法及代码示例
- Elixir Kernel.left > right用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.use(module, opts \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。