只要合法,shell 就会尝试将字符串打印为字符串。这意味着恰好 all 为有效字符的整数列表将被打印为字符,而包含其他内容的列表将被打印为列表:
1> [65,66,67].
"ABC"
2> [3,65,66,67].
[3,65,66,67]
但请注意,我实际上并没有调用任何输出函数。这只是 shell 隐式回显返回值的便利操作,因此作为程序员的您可以检查它。
如果我想显式调用一个输出函数,我应该使用一个格式字符串来指定要插值的值的性质:
3> io:format("This is a list: ~tw~n", [List]).
This is a list: [65,66,67]
ok
4> io:format("This is a list rendered as an implied string: ~tp~n", [List]).
This is a list rendered as an implied string: "ABC"
ok
5> io:format("This is a string: ~ts~n", [List]).
This is a string: ABC
ok
注意每次打印后的附加原子ok。那是因为io:format/2 的返回值是ok。所以我们从format/2 获取显式输出,然后查看它的返回值。
io 模块文档页面有详细信息:http://erlang.org/doc/man/io.html#format-1
回到你的例子...
6> lists:sublist([6,9,15,24,39,6,96],7,1).
"`"
7> io:format("~tw~n", [lists:sublist([6,9,15,24,39,6,96],7,1)]).
[96]
ok
附录
有一个名为 shell:strings/1 的设置告诉 shell 打开和关闭字符串格式:
1> [65,66,67].
"ABC"
2> shell:strings(false).
true
3> [65,66,67].
[65,66,67]
4> <<65,66,67>>.
<<65,66,67>>
5> shell:strings(true).
false
6> <<65,66,67>>.
<<"ABC">>
但出于以下几个原因,我不再搞乱这个设置:
- 记住 shell 的这个细节几乎是不值得的(shell 的便捷输出主要用于发现返回 值结构,而不是 特定值通过这些结构 - 当您想要这些数据时,您通常希望将字符串打印为字符串)。
- 在您真正正在处理字符串的任何情况下,它都可能导致令人惊讶的 shell 输出。
- 这几乎不是您真正想要的行为。
- 在处理实际程序时,您将需要使用
io 或 io_lib 模块的实际输出函数,并且围绕格式字符串养成习惯比担心从 shell 输出的便利性要有用得多。