2

我正在用 Erlang 构建一个简单的井字游戏程序。我将电路板作为字符串传递给io:format("123\n456\n789\n")并希望看到:

123
456
789

但是在 Erlang shell 中会io:format("123\n456\n789\n")打印:

123
456
789
ok

有没有办法在没有尾随的情况下输出到控制台?

4

4 回答 4

6

ok那里告诉你电话有效。函数io:format的规范指定了这一点。

这里真正的问题是您看到的是 erlang 终端的混合,以及来自 stdout 的任何内容 - stdout 正在打印数字,而 erlang 终端正在返回ok.

如果您使用 escript 编写脚本,则 ok 策略将不会打印到标准输出 - 您应该简单地将控制台视为交互式解释器。

作为旁注最简单的输出方法:

123
456
789

将会

1> 123. 456. 789.
123
456
789
于 2013-09-04T23:35:01.030 回答
4

ok打印最后一个原子的是外壳。试试这个:

erl -noshell -eval 'io:format("123\n456\n789\n"),init:stop()'
于 2013-09-04T23:54:54.807 回答
1

Erlang shell 是一个 REPL,一个读取/评估/打印循环。它读取输入的表达式,对其进行评估,打印结果并循环以读取表达式。要记住的重要一点是,您输入的表达式总是返回一个值,而 shell总是打印该值。你不能不返回一个值!

因此,当您进入io:format("123\n456\n789\n").shell 时,会评估表达式并打印结果。评估对io:format结果的调用会打印出字符串,并且调用会返回okshell 打印出的值。因此你得到

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.

于 2013-09-05T21:09:33.733 回答
-1

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
于 2013-09-10T23:58:20.503 回答