来自 elixir 脚本的非常基本的 IEx 和 IEx.pry 出现错误:IEx shell 正在运行?

Jef*_*ndt 5 elixir elixir-iex

我正在阅读 Dave Thomas 的《Programming Elixir》,并尝试列表章节中的一些示例。

当我学习一门语言时,我更喜欢通过跑步来尽可能保持基础<language executable> <script file>。在这种情况下我正在跑步elixir reduce.exs

reduce.exs 的内容:

require IEx;

defmodule MyList do
  def reduce([], memo, _), do: memo
  def reduce([head | tail], memo, func) do
    IEx.pry
    reduce(tail, func.(head, memo), func)
  end
end

ExUnit.start()
defmodule MyListTest do
  use ExUnit.Case

  def test do
    assert 10 == MyList.reduce([1,2,3,4], 0, &(&1 + &2))
  end
end

IO.puts(MyListTest.test())
Run Code Online (Sandbox Code Playgroud)

运行时控制台输出:

Cannot pry #PID<0.70.0> at reduce.exs:9. Is an IEx shell running?
Run Code Online (Sandbox Code Playgroud)

我认为我完全误解了一些核心概念,但我不完全确定它们是什么。

iex我的期望是,当程序执行 时,它就会进入会话IEx.pry。鉴于 iex 在 elixir 核心库中,我认为require IEx使用 pry 就足够了。

我需要使用吗IEx.pry/3?我是否需要运行单独的 iex 实例并以某种方式将两个节点连接在一起?

只需通过运行运行文件来评估代码iex reduce.exs,但它不会显示测试输出。

请随意纠正我所做的任何愚蠢的假设。

Dan*_*ake 5

您收到此错误是因为IEx需要运行。使用该命令iex reduce.exs将允许您输入代码及其IEx.pry在源文件中的位置。

要从那里继续执行,请respawn在 shell 中键入。它会询问您是否允许每次递归进行窥探,但最终会打印出测试结果。

您事先没有看到测试输出的原因是,它IEx.pry会停止执行,因此您的测试函数尚未返回并且IO.puts调用尚未完成。