我正在用 Erlang 构建一个简单的井字游戏程序。我将电路板作为字符串传递给io:format("123\n456\n789\n")
并希望看到:
123
456
789
但是在 Erlang shell 中会io:format("123\n456\n789\n")
打印:
123
456
789
ok
有没有办法在没有尾随的情况下输出到控制台?
我正在用 Erlang 构建一个简单的井字游戏程序。我将电路板作为字符串传递给io:format("123\n456\n789\n")
并希望看到:
123
456
789
但是在 Erlang shell 中会io:format("123\n456\n789\n")
打印:
123
456
789
ok
有没有办法在没有尾随的情况下输出到控制台?
ok
那里告诉你电话有效。函数io:format的规范指定了这一点。
这里真正的问题是您看到的是 erlang 终端的混合,以及来自 stdout 的任何内容 - stdout 正在打印数字,而 erlang 终端正在返回ok
.
如果您使用 escript 编写脚本,则 ok 策略将不会打印到标准输出 - 您应该简单地将控制台视为交互式解释器。
作为旁注最简单的输出方法:
123
456
789
将会
1> 123. 456. 789.
123
456
789
ok
打印最后一个原子的是外壳。试试这个:
erl -noshell -eval 'io:format("123\n456\n789\n"),init:stop()'
Erlang shell 是一个 REPL,一个读取/评估/打印循环。它读取输入的表达式,对其进行评估,打印结果并循环以读取表达式。要记住的重要一点是,您输入的表达式总是返回一个值,而 shell总是打印该值。你不能不返回一个值!
因此,当您进入io:format("123\n456\n789\n").
shell 时,会评估表达式并打印结果。评估对io:format
结果的调用会打印出字符串,并且调用会返回ok
shell 打印出的值。因此你得到
123
456
789
ok
Again the shell always prints the value returned by the expression. If you call io:format
from within another function then its return value will generally not be returned to shell and the shell will not print it out.
Note that returning a value and printing something are two completely different things.
Here is a workaround (It's just for fun:)
):
> spawn(fun() -> timer:sleep(1000), io:format("123\n456\n789\n") end).
<0.77.0>
123
456
789