代码 | Code
码
用于管理代码编译,代码评估和代码加载的实用程序。
该模块补充了Erlang的:code
模块,添加了Elixir特有的行为。几乎这个模块中的所有功能都对Elixir的行为有全局性的副作用。
概要
功能
append_path(path)
在Erlang VM代码路径列表的末尾附加一个路径
available_compiler_options()
用可用的编译器选项返回一个列表
compile_quoted(quoted, file \ "nofile")
编译引用的表达式
compile_string(string, file \ "nofile")
编译给定的字符串
compiler_options()
从代码服务器获取编译选项
compiler_options(opts)
设置编译选项
delete_path(path)
从Erlang VM代码路径列表中删除路径。这是Erlang VM用于查找模块代码的目录列表
ensure_compiled(module)
确保给定的模块被编译和加载
ensure_compiled?(module)
确保给定的模块被编译和加载
ensure_loaded(module)
确保给定的模块已加载
ensure_loaded?(module)
确保给定的模块已加载
eval_file(file, relative_to \ nil)
等待给定的文件
eval_quoted(quoted, binding \ [], opts \ [])
评估报价内容
eval_string(string, binding \ [], opts \ [])
评估给出的内容 string
get_docs(module, kind)
返回给定模块的文档
load_file(file, relative_to \ nil)
加载给定的文件
loaded_files()
列出所有加载的文件
prepend_path(path)
在Erlang VM代码路径列表的开始处添加一条路径
require_file(file, relative_to \ nil)
需要给定的文件
string_to_quoted(string,opts \ [])
将给定的字符串转换为其引用形式
string_to_quoted!(string, opts \ [])
将给定的字符串转换为其引用形式
unload_files(文件)
从加载的文件列表中删除文件
功能
append_path(path)
在Erlang VM代码路径列表的末尾附加一个路径。
这是ErlangVM用于查找模块代码的目录列表。
路径Path.expand/1
在被追加之前被扩展。如果此路径不存在,则返回错误。
实例
Code.append_path(".") #=> true
Code.append_path("/does_not_exist") #=> {:error, :bad_directory}
available_compiler_options()
返回带有可用编译器选项的列表。
查看Code.compiler_options/1
更多信息。
实例
iex> Code.available_compiler_options
[:docs, :debug_info, :ignore_module_conflict, :relative_paths, :warnings_as_errors]
compile_quoted(quoted, file \ "nofile")
编译引用的表达式。
返回一个元组列表,其中第一个元素是模块名称,第二个元素是它的字节码(作为二进制文件)。
compile_string(string, file \ "nofile")
编译给定的字符串。
返回一个元组列表,其中第一个元素是模块名称,第二个元素是它的字节码(作为二进制文件)。
要一次编译多个文件,请检查Kernel.ParallelCompiler.files/2
。
compiler_options()
从代码服务器获取编译选项。
检查compiler_options/1
更多信息。
实例
Code.compiler_options
#=> %{debug_info: true, docs: true,
warnings_as_errors: false, ignore_module_conflict: false}
compiler_options(选)
设置编译选项。
这些选项是全球性的,因为它们是由Elixir的代码服务器存储的。
可供选择的办法有:
- :docs - 如果为true,则保留编译模块中的文档,默认为true
- :debug_info - 如果为true,则保留编译模块中的调试信息; 这允许开发人员重建原始源代码,默认为false
- :ignore_module_conflict - 如果为true,则覆盖已经定义但不会引发错误的模块,默认为false
- :relative_paths - 如果为true,则在带引号的节点中使用相对路径,编译器生成的警告和错误,默认情况下为true。 注意禁用此选项不会影响运行时警告和错误。
:warnings_as_errors - 在生成警告时导致编译失败它将返回编译器选项的新表.ExamplesCode.compiler_options(debug_info:true)#=>%{debug_info:true,docs:true,
:file
- 评估中要考虑的文件
:line
- 脚本开始的行
另外,可以配置以下范围值:
:aliases
- 具有别名及其目标的元组列表
:requires
- 需要的模块列表
:functions
- 第一个元素是模块的元组列表,第二个是导入的函数名称和元组列表; 函数名称和参数列表必须进行排序
:macros
- 第一个元素是模块的元组列表,第二个是导入的宏名称和元组列表; 函数名称和参数列表必须进行排序
请注意,设置上述任何值都会覆盖Elixir的默认值。 例如,设置:需要[],将不再自动需要内核模块; 以相同的方式设置:宏将不再像例如/ 2,case / 2等那样自动导入内核宏
返回格式为{value,binding}的元组,其中value是从评估字符串返回的值。 如果在评估字符串时发生错误,则会引发异常。
绑定是一个关键字列表,其中包含评估字符串后所有变量绑定的值。 绑定键通常是一个原子,但它可能是在不同上下文中定义的变量的元组。
实例
iex> Code.eval_string("a + b", [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line)
{3, [a: 1, b: 2]}
iex> Code.eval_string("c = a + b", [a: 1, b: 2], __ENV__)
{3, [a: 1, b: 2, c: 3]}
iex> Code.eval_string("a = a + b", [a: 1, b: 2])
{3, [a: 3, b: 2]}
为方便起见,您可以传递__ENV __ / 0作为opts参数,并且当前环境中定义的所有导入,要求和别名将自动结束:
iex> Code.eval_string("a + b", [a: 1, b: 2], __ENV__)
{3, [a: 1, b: 2]}
get_docs(module, kind)
返回给定模块的文档。
当给定模块名称时,它会找到它的BEAM代码并从中读取文档。
给出.beam文件的路径时,它将直接从该文件加载文档。
返回值取决于kind
值:
:docs
- 使用该@doc
属性附加到函数和宏的所有文档字符串的列表
- :moduledoc- 元组{<line>, <doc>}其中line是模块定义开始的行,并且doc是使用该@moduledoc属性附加到模块的字符串
:callback_docs
- 附加到@callbacks
使用该@doc
属性的所有文档字符串列表
:type_docs
-@type
使用该@typedoc
属性附加到回调的所有文档字符串列表
:all - 包含以下内容的关键字列表:docs和:moduledoc,:callback_docs和:type_docs.如果无法找到该模块,则返回nil.Examples#获取模块文档
:file
- 在堆栈跟踪中使用的文件名和在__ENV__/0
宏中报告的文件
- :行 - 在__ENV __ / 0宏中报告的行
- :existing_atoms_only - 如果为true,则在标记器找到不存在的原子时引发错误
Macro.to_string / 2
将字符串Macro.to_string/2
转换为引用形式的反义词是将引用的表单转换为字符串/二进制表示形式。
string_to_quoted!(string, opts \ [])
将给定的字符串转换为其引用形式。
如果成功则返回ast,否则引发异常。 如果令牌丢失(通常是因为表达式不完整),则为TokenMissingError,否则为SyntaxError。
检查string_to_quoted/2
选项信息。
unload_files(files)
从加载的文件列表中删除文件。
文件中定义的模块不会被删除; 调用此函数只会将它们从列表中删除,从而使它们再次被需要。
实例
# Load EEx test code, unload file, check for functions still available
Code.load_file("../eex/test/eex_test.exs")
Code.unload_files(Code.loaded_files)
function_exported?(EExTest.Compiled, :before_compile, 0) #=> true