查看源代码 IEx.Helpers (IEx v1.16.2)
欢迎来到交互式 Elixir。您目前看到的是模块 IEx.Helpers
的文档,它提供了许多助手来使 Elixir 的 shell 更加令人愉快地使用。
此消息是由调用助手 h()
触发的,通常称为 h/0
(因为它期望 0 个参数)。
您可以使用 h/1
函数调用任何 Elixir 模块或函数的文档。
iex> h(Enum)
iex> h(Enum.map)
iex> h(Enum.reverse/1)
您还可以使用 i/1
函数来内省您在 shell 中拥有的任何值。
iex> i("hello")
还有许多其他可用的助手,以下是一些示例:
b/1
- 打印给定模块的回调信息和文档。c/1
- 编译文件。c/2
- 编译文件并将字节码写入给定路径。cd/1
- 更改当前目录。clear/0
- 清除屏幕。exports/1
- 显示模块中的所有导出内容(函数 + 宏)。flush/0
- 刷新发送到 shell 的所有消息。h/0
- 打印此帮助消息。h/1
- 打印给定模块、函数或宏的帮助信息。i/0
- 打印有关最后一个值的的信息。i/1
- 打印有关给定项的信息。ls/0
- 列出当前目录的内容。ls/1
- 列出指定目录的内容。open/1
- 在您的编辑器中打开给定模块或函数的源代码。pid/1
- 从字符串创建 PID。pid/3
- 使用传递的 3 个整数参数创建 PID。port/1
- 从字符串创建端口。port/2
- 使用传递的 2 个非负整数创建端口。pwd/0
- 打印当前工作目录。r/1
- 重新编译给定模块的源文件。recompile/0
- 重新编译当前项目。ref/1
- 从字符串创建引用。ref/4
- 使用传递的 4 个整数参数创建引用。runtime_info/0
- 打印运行时信息(版本、内存使用情况、统计信息)。t/1
- 打印给定模块或函数的类型。v/0
- 从历史记录中检索最后一个值。v/1
- 从历史记录中检索第 n 个值。
您可以使用 h/1
助手本身直接从命令行查看所有这些函数的帮助信息。试试
iex> h(v/0)
列出所有可用的 IEx 助手,这实际上是 IEx.Helpers
模块中的所有导出内容(函数和宏)。
iex> exports(IEx.Helpers)
此模块还包含用于调试目的的助手,有关更多信息,请参见 IEx.break!/4
。
要了解有关 IEx 的更多信息,请键入 h(IEx)
。
总结
函数
打印给定回调函数的文档。
在形状为 Module.function/arity
的 AST 中设置断点,并使用给定的 stops
数量。
在 module
、function
和 arity
中设置断点,并使用给定的 stops
数量。
将所有断点打印到终端。
编译给定的文件。
将当前工作目录更改为给定的路径。
清除控制台屏幕。
继续执行当前进程。
打印给定模块导出的所有函数和宏的列表。
清除发送到 shell 收件箱的所有消息,并将其打印出来。
打印 IEx.Helpers
的文档。
打印给定模块或给定 function/arity
对的文档。
打印有关任何给定项的数据类型的的信息。
注入 path
处文件的 内容。
与 import_file
类似,但仅在文件可用时才导入文件。
使用给定参数调用 import/2
,但仅在模块可用时才调用。
加载给定模块的 BEAM 代码(并确保任何以前的旧版本在之前已正确清除)。
打印给定目录内容的列表。
转到当前断点的下一行。
将给定模块的 BEAM 代码部署到节点列表。
打开当前正在 pry 的位置。
打开给定的 module
、module.function/arity
或 {file, line}
。
从 string
或 atom
创建 PID。
使用作为参数传递给函数的 3 个非负整数创建 PID。
从 string
创建端口。
从两个非负整数创建端口。
打印当前工作目录。
重新编译并重新加载给定的 module
或 modules
。
重新编译当前 Mix 项目或 Mix 安装依赖项。
从 string
创建引用。
从其 4 个非负整数组件创建引用。
从所有模块中删除所有断点和 instrumentation。
从 module
中删除所有断点和 instrumentation。
将具有给定 id
的断点中的挂起停止次数设置为零。
将给定模块、函数和 arity 中的挂起停止次数设置为零。
通过启动新的 shell 进程来重新生成当前 shell。
打印 VM/运行时信息,如版本、内存使用情况和统计信息。
与 runtime_info/0
一样,除了接受主题或主题列表。
打印给定模块或给定函数/arity 对的类型。
使用给定参数调用 use/2
,但仅在模块可用时才调用。
返回历史记录中第 n
个表达式的值。
在 pry 会话中打印当前位置和堆栈跟踪。
函数
打印给定回调函数的文档。
它还接受单个模块参数以列出所有可用的行为回调。
示例
iex> b(Mix.Task.run/1)
iex> b(Mix.Task.run)
iex> b(GenServer)
在形状为 Module.function/arity
的 AST 中设置断点,并使用给定的 stops
数量。
有关 IEx 中断点的完整描述,请参见 IEx.break!/4
。
示例
break! URI.decode_query/2
在 module
、function
和 arity
中设置断点,并使用给定的 stops
数量。
有关 IEx 中断点的完整描述,请参见 IEx.break!/4
。
示例
break! URI, :decode_query, 2
将所有断点打印到终端。
编译给定的文件。
它期望一个要编译的文件列表和一个可选路径,将编译后的代码写入该路径。默认情况下,文件是在内存中编译的。要将编译后的文件写入当前目录,可以给出空字符串。
它返回编译模块的名称。
如果要重新编译现有模块,请改为检查 r/1
。
示例
在下面的示例中,我们传递了一个目录,c/2
函数将向该目录写入编译后的 .beam
文件。此目录通常在 Erlang/Elixir 系统中命名为 "ebin"
iex> c(["foo.ex", "bar.ex"], "ebin")
[Foo, Bar]
编译一个文件时,无需将其包装在列表中。
iex> c("baz.ex")
[Baz]
将当前工作目录更改为给定的路径。
清除控制台屏幕。
此函数仅在 shell 上启用了 ANSI 转义代码时才有效,这意味着此函数在 Windows 机器上默认情况下不可用。
继续执行当前进程。
这通常由使用 IEx.pry/0
或 IEx.break!/4
启动的会话调用。这允许当前进程执行到下一个断点,该断点将自动将控制权交回 IEx,而无需请求 pry 权限。
如果您只想移动到当前断点的下一行,请使用 n/0
或 next/0
代替。
如果正在运行的进程终止,将启动一个新的 IEx 会话。
在进程执行期间,用户将不再控制 shell。如果您想启动一个新的 shell,请使用 respawn/0
代替。
打印给定模块导出的所有函数和宏的列表。
清除发送到 shell 收件箱的所有消息,并将其打印出来。
打印 IEx.Helpers
的文档。
打印给定模块或给定 function/arity
对的文档。
示例
iex> h(Enum)
它还接受 function/arity
和 module.function/arity
格式的函数,例如
iex> h(receive/1)
iex> h(Enum.all?/2)
iex> h(Enum.all?)
打印有关任何给定项的数据类型的的信息。
如果没有给出参数,将使用前一个表达式的值。
示例
iex> i(1..5)
将打印
Term
1..5
Data type
Range
Description
This is a struct. Structs are maps with a __struct__ key.
Reference modules
Range, Map
注入 path
处文件的 内容。
这等同于获取所有文件内容,并将其一次性粘贴到 IEx 中并执行。
默认情况下,在启动 IEx 的同一目录中,.iex.exs
文件的内容会自动导入。有关更多信息,请参阅 IEx
模块文档中关于 ".iex.exs" 的部分。
path
必须是字面量字符串,并且会通过 Path.expand/1
自动扩展。
示例
# ~/file.exs
value = 13
# in the shell
iex(1)> import_file("~/file.exs")
13
iex(2)> value
13
与 import_file
类似,但仅在文件可用时才导入文件。
默认情况下,当给定的文件不存在时,import_file/1
会失败。但是,由于 import_file/1
在编译时扩展,因此无法有条件地导入文件,因为宏总是会被扩展。
# This raises a File.Error if ~/.iex.exs doesn't exist.
if "~/.iex.exs" |> Path.expand() |> File.exists?() do
import_file("~/.iex.exs")
end
这个宏通过代表用户检查文件是否存在来解决这个问题。
使用给定参数调用 import/2
,但仅在模块可用时才调用。
这使您可以在 .iex.exs
文件(包括 ~/.iex.exs
)中放置导入,而不会在打开模块不可用的控制台时出现编译错误。
示例
# In ~/.iex.exs
import_if_available(Ecto.Query)
加载给定模块的 BEAM 代码(并确保任何以前的旧版本在之前已正确清除)。
当您知道模块的字节码已在文件系统中更新,并且您想告诉 VM 加载它时,此函数很有用。
打印给定目录内容的列表。
如果 path
指向文件,则打印其完整路径。
是 next/0
的快捷方式。
转到当前断点的下一行。
这通常由使用 IEx.break!/4
启动的会话调用。如果您想移动到下一个断点而不是下一行,请改为调用 continue/0
。
在进程执行期间,用户将不再控制 shell。如果您想启动一个新的 shell,请使用 respawn/0
代替。
将给定模块的 BEAM 代码部署到节点列表。
当您有已编译或在本地更新的代码,并且您想在其他节点上运行它时,此函数对于开发和调试很有用。
节点列表默认设置为所有连接节点的列表。
如果本地找不到模块的对象代码(即 ".beam" 文件),则返回 {:error, :nofile}
。
示例
iex> nl(HelloWorld)
{:ok,
[
{:node1@easthost, :loaded, HelloWorld},
{:node1@westhost, :loaded, HelloWorld}
]}
iex> nl(NoSuchModuleExists)
{:error, :nofile}
打开当前正在 pry 的位置。
此命令仅在通过 IEx.pry/0
手动启动的 pry 会话或通过 IEx.break!/4
设置的断点中有效。在常规的 IEx
会话期间调用此函数将打印错误。
请记住,当 pry 预编译的源代码(例如 Elixir 本身)时,open/0
位置可能不存在。
有关更多信息以及如何打开任何模块或函数,请参阅 open/1
。
打开给定的 module
、module.function/arity
或 {file, line}
。
此函数使用 ELIXIR_EDITOR
环境变量,如果前者不可用,则回退到 EDITOR
。
默认情况下,它尝试使用 file:line
符号打开文件和行。例如,对于 Sublime Text,您可以将其设置为
ELIXIR_EDITOR="subl"
然后它将尝试将其打开为
subl path/to/file:line
对于 Visual Studio Code,在命令行上启用后,您可以将其设置为
ELIXIR_EDITOR="code --goto"
重要的是,您选择的编辑器命令不会阻塞,也不会尝试在终端中直接运行编辑器。基于命令行的编辑器可能需要额外的配置,以便它们在单独的窗口中打开给定的文件和行。
对于更复杂的使用案例,您可以使用 __FILE__
和 __LINE__
符号将文件和行显式插入命令中
ELIXIR_EDITOR="my_editor +__LINE__ __FILE__"
由于此函数会打印编辑器返回的结果,因此如果希望显示位置而不是打开它,可以将 ELIXIR_EDITOR
设置为 "echo"。
请记住,在打开预编译的源代码时,位置可能不存在。
示例
iex> open(MyApp)
iex> open(MyApp.fun/2)
iex> open({"path/to/file", 1})
从 string
或 atom
创建 PID。
示例
iex> pid("0.21.32")
#PID<0.21.32>
iex> pid("#PID<0.21.32>")
#PID<0.21.32>
iex> pid(:init)
#PID<0.0.0>
使用作为参数传递给函数的 3 个非负整数创建 PID。
示例
iex> pid(0, 21, 32)
#PID<0.21.32>
iex> pid(0, 64, 2048)
#PID<0.64.2048>
从 string
创建端口。
示例
iex> port("0.4")
#Port<0.4>
从两个非负整数创建端口。
示例
iex> port(0, 8080)
#Port<0.8080>
iex> port(0, 443)
#Port<0.443>
打印当前工作目录。
重新编译并重新加载给定的 module
或 modules
。
请注意,与 modules
在同一文件中定义的所有模块都将被重新编译和重新加载。如果您想重新加载多个模块,最好同时重新加载它们,例如在 r [Foo, Bar]
中。这对于避免错误警告很重要,因为模块只在内存中重新加载,其最新信息不会持久化到磁盘。请参阅下面的“内存中重新加载”部分。
此函数旨在用于开发和调试目的。不要在生产代码中依赖它。
内存中重新加载
当我们在 IEx 中重新加载模块时,我们会重新编译模块源代码,更新其内存内容。磁盘中的原始 .beam
文件(可能是模块的第一个定义来自该文件)根本不会改变。
由于文档、类型规范和导出信息是从 .beam 文件中加载的,因此在您调用此函数时,它们不会被重新加载。
重新编译当前 Mix 项目或 Mix 安装依赖项。
此助手需要在当前 IEx 会话中调用 Mix.install/2
,或者 IEx 需要与它一起启动,例如 iex -S mix
。
在 Mix.install/1
情况下,它将重新编译安装期间声明的任何过时的路径依赖项。在一个项目中,它将重新编译任何过时的模块。
请注意,此函数只是重新编译 Elixir 模块,不会重新加载配置或重启应用程序。这意味着任何长期运行的进程都可能在重新编译时崩溃,因为更改的模块将被临时删除并重新编译,而不会经过适当的代码更改回调。
如果您想重新加载单个模块,请考虑使用 r(ModuleName)
代替。
此函数旨在用于开发和调试目的。不要在生产代码中依赖它。
选项
:force
- 当true
时,强制应用程序重新编译
从 string
创建引用。
示例
iex> ref("0.1.2.3")
#Reference<0.1.2.3>
从其 4 个非负整数组件创建引用。
示例
iex> ref(0, 1, 2, 3)
#Reference<0.1.2.3>
从所有模块中删除所有断点和 instrumentation。
从 module
中删除所有断点和 instrumentation。
将具有给定 id
的断点中的挂起停止次数设置为零。
如果存在这样的断点 ID,则返回 :ok
。否则返回 :not_found
。
请注意,模块在重置时仍然是“已检测”。如果您希望有效地从模块中删除所有断点和检测代码,请使用 remove_breaks/1
代替。
将给定模块、函数和 arity 中的挂起停止次数设置为零。
如果模块没有被检测,或者给定的函数没有断点,则它是一个无操作,并且它返回 :not_found
。否则它返回 :ok
。
请注意,模块在重置时仍然是“已检测”。如果您希望有效地从模块中删除所有断点和检测代码,请使用 remove_breaks/1
代替。
通过启动新的 shell 进程来重新生成当前 shell。
打印 VM/运行时信息,如版本、内存使用情况和统计信息。
其他主题可以通过 runtime_info/1
获得。
有关更多指标、信息和调试工具,请参阅 Recon 项目。
与 runtime_info/0
一样,除了接受主题或主题列表。
例如,主题 :applications
将列出已加载的应用程序。
打印给定模块或给定函数/arity 对的类型。
示例
iex> t(Enum)
@type t() :: Enumerable.t()
@type acc() :: any()
@type element() :: any()
@type index() :: integer()
@type default() :: any()
iex> t(Enum.t/0)
@type t() :: Enumerable.t()
iex> t(Enum.t)
@type t() :: Enumerable.t()
使用给定参数调用 use/2
,但仅在模块可用时才调用。
这使您可以在 .iex.exs
文件(包括 ~/.iex.exs
)中使用该模块,即使您在模块不可用的情况下打开了控制台,也不会出现编译错误。
示例
# In ~/.iex.exs
use_if_available(Phoenix.HTML)
返回历史记录中第 n
个表达式的值。
n
可以是负值:如果是负值,则返回相对于当前表达式的表达式值。例如,v(-2)
返回最后一个表达式之前计算的表达式的值。特别是,v(-1)
返回最后一个计算的表达式的结果,而 v()
执行相同的操作。
示例
iex(1)> "hello" <> " world"
"hello world"
iex(2)> 40 + 2
42
iex(3)> v(-2)
"hello world"
iex(4)> v(2)
42
iex(5)> v()
42
在 pry 会话中打印当前位置和堆栈跟踪。
它期望一个 radius
,该值选择应该打印当前行之前和之后多少行。默认情况下,radius
为两行。
Location: lib/iex/lib/iex/helpers.ex:79
77:
78: def recompile do
79: require IEx; IEx.pry()
80: if mix_started?() do
81: config = Mix.Project.config
(IEx.Helpers) lib/iex/lib/iex/helpers.ex:78: IEx.Helpers.recompile/0
此命令仅在通过 IEx.pry/0
手动启动的 pry 会话或通过 IEx.break!/4
设置的断点中有效。在常规的 IEx
会话期间调用此函数将打印错误。
请记住,在窥视预编译的源代码(例如 Elixir 本身)时,whereami/1
位置可能不存在。