使用Elixir进行基本打印 - IO.puts错误:**(ArgumentError)参数错误(stdlib):io.put_chars(#PID

这是我试图为Elixir 1.0.3运行的程序:

IO.puts "putstest"

div2 = fn inputnum ->
  [:a, inputnum/4, inputnum/7, inputnum/5.0, inputnum/7, inputnum*88]
end

myoutput = div2.(300.0)

IO.puts myoutput

我添加了:一个原子,以防Elixir进行某种隐式转换 .

我是Elixir的新手 . 当我通过 $ elixir putztestzorz.exs 运行上面的代码时,我不断收到以下错误:

putstest
** (ArgumentError) argument error
    (stdlib) :io.put_chars(#PID<0.24.0>, :unicode, [[:a, 75.0, 42.857142857142854, 60.0, 42.857142857142854, 2.64e4], 10])
    (elixir) lib/code.ex:316: Code.require_file/2

我在http://elixir-lang.org/docs/master/elixir/IO.html检查了文档,但是没有 IO.stream (将io设备转换为IO.Stream,将最后一行转换为 IO.stream output )也没有 IO.write (将给定参数写入给定设备,将最后一行更改为 IO.write :stdout, output )似乎做了诀窍 .

我不想只是猜测,在这里,我似乎不太明白该函数应该做什么 .

是否有类似于Python的 print() ,这将是有效的吗?

我需要列出清单吗?

我可能在这里遗漏了一些非常简单的东西,但我不想在IO处理函数列表中猜测 .

(P.S.文档一直在谈论 Process.group_leader . 我不打算对此做很多事情,但有没有办法把它放在这种事情的背景下?我一直在想象星球大战的Red Leader . )

回答(1)

2 years ago

问题是 IO.puts 无法处理任意列表,因此 ArgumentError . 它可以处理的唯一类型的列表是字符列表或单引号字符串 . 这就是函数成功匹配list参数的原因,但后来在库内深处爆炸 . 你基本上有两种选择:

使用 IO.inspect 快速调试任何值到stdout .

IO.inspect myoutput

使用 for 理解与Erlang的 :io.format 一起显式格式化输出,就像printf一样 . :a 可能会抛出错误,但如果删除它,则以下内容应该有效:

for x <- myoutput do
  :io.format "~.2f~n", [x]
end

请注意 ~.2f 在逗号后面打印两位数的值 . ~n 添加换行符 .