查看源代码 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 数量。

modulefunctionarity 中设置断点,并使用给定的 stops 数量。

将所有断点打印到终端。

编译给定的文件。

将当前工作目录更改为给定的路径。

清除控制台屏幕。

继续执行当前进程。

打印给定模块导出的所有函数和宏的列表。

清除发送到 shell 收件箱的所有消息,并将其打印出来。

h()

打印 IEx.Helpers 的文档。

打印给定模块或给定 function/arity 对的文档。

打印有关任何给定项的数据类型的的信息。

注入 path 处文件的 内容。

import_file 类似,但仅在文件可用时才导入文件。

使用给定参数调用 import/2,但仅在模块可用时才调用。

加载给定模块的 BEAM 代码(并确保任何以前的旧版本在之前已正确清除)。

打印给定目录内容的列表。

n()

next/0 的快捷方式。

转到当前断点的下一行。

将给定模块的 BEAM 代码部署到节点列表。

打开当前正在 pry 的位置。

打开给定的 modulemodule.function/arity{file, line}

stringatom 创建 PID。

使用作为参数传递给函数的 3 个非负整数创建 PID。

string 创建端口。

从两个非负整数创建端口。

打印当前工作目录。

重新编译并重新加载给定的 modulemodules

重新编译当前 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)
链接到此宏

break!(ast, stops \\ 1)

查看源代码 (自 1.5.0 起) (宏)

在形状为 Module.function/arity 的 AST 中设置断点,并使用给定的 stops 数量。

有关 IEx 中断点的完整描述,请参见 IEx.break!/4

示例

break! URI.decode_query/2
链接到此函数

break!(module, function, arity, stops \\ 1)

查看源代码 (自 1.5.0 起)

modulefunctionarity 中设置断点,并使用给定的 stops 数量。

有关 IEx 中断点的完整描述,请参见 IEx.break!/4

示例

break! URI, :decode_query, 2
链接到此函数

breaks()

查看源代码 (自 1.5.0 起)

将所有断点打印到终端。

链接到此函数

c(files, path \\ :in_memory)

查看源代码

编译给定的文件。

它期望一个要编译的文件列表和一个可选路径,将编译后的代码写入该路径。默认情况下,文件是在内存中编译的。要将编译后的文件写入当前目录,可以给出空字符串。

它返回编译模块的名称。

如果要重新编译现有模块,请改为检查 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 机器上默认情况下不可用。

链接到此函数

continue()

查看源代码 (自 1.5.0 起)

继续执行当前进程。

这通常由使用 IEx.pry/0IEx.break!/4 启动的会话调用。这允许当前进程执行到下一个断点,该断点将自动将控制权交回 IEx,而无需请求 pry 权限。

如果您只想移动到当前断点的下一行,请使用 n/0next/0 代替。

如果正在运行的进程终止,将启动一个新的 IEx 会话。

在进程执行期间,用户将不再控制 shell。如果您想启动一个新的 shell,请使用 respawn/0 代替。

链接到此函数

exports(module \\ Kernel)

View Source (since 1.5.0)

打印给定模块导出的所有函数和宏的列表。

清除发送到 shell 收件箱的所有消息,并将其打印出来。

打印 IEx.Helpers 的文档。

打印给定模块或给定 function/arity 对的文档。

示例

iex> h(Enum)

它还接受 function/aritymodule.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
链接到此宏

import_file(path)

View Source (since 1.4.0) (macro)

注入 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_if_available(path)

View Source (macro)

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_if_available(quoted_module, opts \\ [])

View Source (macro)

使用给定参数调用 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 代替。

链接到此函数

nl(nodes \\ Node.list(), module)

查看源代码

将给定模块的 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

打开给定的 modulemodule.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})

stringatom 创建 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>
链接到此函数

port(string)

View Source (since 1.8.0)

string 创建端口。

示例

iex> port("0.4")
#Port<0.4>
链接到此函数

port(major, minor)

View Source (since 1.8.0)

从两个非负整数创建端口。

示例

iex> port(0, 8080)
#Port<0.8080>
iex> port(0, 443)
#Port<0.443>

打印当前工作目录。

重新编译并重新加载给定的 modulemodules

请注意,与 modules 在同一文件中定义的所有模块都将被重新编译和重新加载。如果您想重新加载多个模块,最好同时重新加载它们,例如在 r [Foo, Bar] 中。这对于避免错误警告很重要,因为模块只在内存中重新加载,其最新信息不会持久化到磁盘。请参阅下面的“内存中重新加载”部分。

此函数旨在用于开发和调试目的。不要在生产代码中依赖它。

内存中重新加载

当我们在 IEx 中重新加载模块时,我们会重新编译模块源代码,更新其内存内容。磁盘中的原始 .beam 文件(可能是模块的第一个定义来自该文件)根本不会改变。

由于文档、类型规范和导出信息是从 .beam 文件中加载的,因此在您调用此函数时,它们不会被重新加载。

链接到此函数

recompile(options \\ [])

查看源代码

重新编译当前 Mix 项目或 Mix 安装依赖项。

此助手需要在当前 IEx 会话中调用 Mix.install/2,或者 IEx 需要与它一起启动,例如 iex -S mix

Mix.install/1 情况下,它将重新编译安装期间声明的任何过时的路径依赖项。在一个项目中,它将重新编译任何过时的模块。

请注意,此函数只是重新编译 Elixir 模块,不会重新加载配置或重启应用程序。这意味着任何长期运行的进程都可能在重新编译时崩溃,因为更改的模块将被临时删除并重新编译,而不会经过适当的代码更改回调。

如果您想重新加载单个模块,请考虑使用 r(ModuleName) 代替。

此函数旨在用于开发和调试目的。不要在生产代码中依赖它。

选项

  • :force - 当 true 时,强制应用程序重新编译
链接到此函数

ref(string)

View Source (since 1.6.0)

string 创建引用。

示例

iex> ref("0.1.2.3")
#Reference<0.1.2.3>
链接到此函数

ref(w, x, y, z)

View Source (since 1.6.0)

从其 4 个非负整数组件创建引用。

示例

iex> ref(0, 1, 2, 3)
#Reference<0.1.2.3>
链接到此函数

remove_breaks()

View Source (since 1.5.0)

从所有模块中删除所有断点和 instrumentation。

链接到此函数

remove_breaks(module)

View Source (since 1.5.0)

module 中删除所有断点和 instrumentation。

链接到此函数

reset_break(id)

View Source (since 1.5.0)

将具有给定 id 的断点中的挂起停止次数设置为零。

如果存在这样的断点 ID,则返回 :ok。否则返回 :not_found

请注意,模块在重置时仍然是“已检测”。如果您希望有效地从模块中删除所有断点和检测代码,请使用 remove_breaks/1 代替。

链接到此函数

reset_break(module, function, arity)

View Source (since 1.5.0)

将给定模块、函数和 arity 中的挂起停止次数设置为零。

如果模块没有被检测,或者给定的函数没有断点,则它是一个无操作,并且它返回 :not_found。否则它返回 :ok

请注意,模块在重置时仍然是“已检测”。如果您希望有效地从模块中删除所有断点和检测代码,请使用 remove_breaks/1 代替。

通过启动新的 shell 进程来重新生成当前 shell。

链接到此函数

runtime_info()

View Source (since 1.5.0)

打印 VM/运行时信息,如版本、内存使用情况和统计信息。

其他主题可以通过 runtime_info/1 获得。

有关更多指标、信息和调试工具,请参阅 Recon 项目。

链接到此函数

runtime_info(topic)

View Source (since 1.5.0)

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_if_available(quoted_module, opts \\ [])

View Source (since 1.7.0) (macro)

使用给定参数调用 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
链接到此函数

whereami(radius \\ 2)

查看源代码 (自 1.5.0 起)

在 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 位置可能不存在。