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

Nat*_*ese 10 io type-conversion elixir

这是我试图为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
Run Code Online (Sandbox Code Playgroud)

我添加了:一个原子,以防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
Run Code Online (Sandbox Code Playgroud)

我检查了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处理函数列表中猜测.

(PS文档一直在谈论a Process.group_leader.我不打算在这方面做太多,但有没有办法把它放在这种事情的背景下?我一直在想象星球大战的红色领袖.)

Pat*_*ity 16

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

使用IO.inspect快速调试任何值到标准输出.

IO.inspect myoutput
Run Code Online (Sandbox Code Playgroud)

for与Erlang一起使用理解:io.format来显式格式化输出,就像printf一样.将:a可能会引发错误,但如果你删除它,下面应该工作:

for x <- myoutput do
  :io.format "~.2f~n", [x]
end
Run Code Online (Sandbox Code Playgroud)

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

  • 另外很高兴知道你可以在字符串插值中进行检查,即IO.puts"这里是一个列表:#{inspect mylist}" (6认同)
  • 是的,`IO.inspect`用于调试 - 一般来说,Elixir无法确定您希望数据表示的方式,而且`IO.inspect`只会产生一些默认表示.如果您需要特定的输出格式,则需要编写一些生成它的代码. (4认同)