Elixir Simple 模块仅产生“参数错误”

Posted

技术标签:

【中文标题】Elixir Simple 模块仅产生“参数错误”【英文标题】:Elixir Simple module produces "Argument Error" only 【发布时间】:2021-02-14 09:27:55 【问题描述】:

我有一个简单的独立模块,可以产生:

长生不老药 impl_bad.ex ** (ArgumentError) 参数错误

在 iex 中:

=> iex Erlang/OTP 23 [erts-11.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] 交互式 Elixir (1.9.4) - 按 Ctrl+C 退出(键入 h() ENTER 寻求帮助) iex(1)> c“impl_bad.ex” == 文件 impl_bad.ex 中的编译错误 == ** (ArgumentError) 参数错误 ** (ArgumentError) 参数错误

代码:

defmodule ImplBad 做 def run_addition_problems(aconfig) 做 do_addition_problems(aconfig) 结尾 结尾

将这 5 行代码单独放在一个文件中。

我知道 do_addition_problems() 没有 存在,但我预计会出现未定义的错误 带有行号。

我从一个项目文件中提取了这段代码,其中 do_addition_problems() 确实存在。

我希望从 编译器。我不得不从 一个大约 1k LOC 的模块来查明这个问题。

这是 Elixir 1.9.4 的问题吗?

【问题讨论】:

看起来确实是 Elixir 版本的问题。当我在 Elixir 1.9.2 本地尝试时,它给了我 ArgumentError 就像你的一样。当我尝试1.9.4-opt-21 时,它给出了一个不错的(CompileError) t.ex:3: undefined function do_addition_problems/1。我使用asdf 工具在elixir 的版本之间进行切换。所以它必须是在 1.9.2 和 1.9.4 之间的编译器中修复的东西。 虽然如果我这样做docker run -it --rm -v "$PWD"/t.ex:/tmp/t.ex elixir:1.9.2-slim elixir /tmp/t.ex,我会收到一个很好的错误消息,与elixir:1.9.4-slim 相同。也许是关于 OTP 版本而不是 Elixir。 【参考方案1】:

这是同时使用Erlang/OTP 23 Elixir 1.9.4 的问题。

Elixir 1.9OTP 23,但 elixir 完全利用 OTP,因此它依赖于来自erlang编译期间编译。

也就是说,将 OTP 降级到版本 Elixir 1.9 知道(我相信21 会很好)升级Elixir 到最近的1.11.1 将解决产生幻想的问题

== Compilation error in file /tmp/test.ex ==
** (CompileError) /tmp/test.ex:3: undefined function do_addition_problems/1
    (elixir 1.11.1) src/elixir_locals.erl:114: anonymous fn/3 in :elixir_locals.ensure_no_undefined_local/3
    (stdlib 3.13.2) erl_eval.erl:680: :erl_eval.do_apply/6

【讨论】:

是的,阿列克谢。作为一个菜鸟,我通过犯错误和接受更有经验的人的解决方案来学习。 Elixir 1.11.1 和 Erlang/OTP 23 一起工作正常。谢谢你。 :) :)

以上是关于Elixir Simple 模块仅产生“参数错误”的主要内容,如果未能解决你的问题,请参考以下文章

Elixir io_lib 调用 erlang

协议可枚举未实现 - Elixir

使用 Erlang 的 Elixir 模块失败

SpaceVim 语言模块 elixir

Elixir重命名并包装Erlang模块?

简单Elixir游戏服设计- 创建项目