Erlang shell“猜测”给定列表是否是可打印的字符串,并以方便的方式打印它。可以禁用这种“便利”吗?
7 回答
我不知道是否可以更改 shell 的默认行为,但您至少可以使用io:format正确格式化输出。
这是一个例子:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
而且由于外壳仅用于实验/维护,io:format()
因此至少对于您的实际应用程序来说已经足够了。也许您还应该考虑编写自己的格式/打印方法,例如formatPerson()
或类似的东西,它可以很好地格式化所有内容。
我倾向于通过在我的 shell 列表中添加一个原子来做到这一点。
例如:
Eshell V5.7.4 (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]
当然,也可以是 [a,65,66,67]。但是 [a|fun_that_returns_a_list()] 将打印“大多数时候是正确的事情(ish)”
您可以使用以 Erlang R16B 开头的shell:strings/1
函数禁用此类行为。
请记住,这是所有节点 shell 的全局选项,并且在完成播放后将其设置回来可能是明智的做法是在更长的活动节点中的 shell。
从 Erlang/OTP R16B 开始,您可以使用函数shell:strings/1来打开或关闭它。请注意,它还会影响实际上是字符串的内容的打印,例如"foo"
在以下示例中:
1> {[8,9,10], "foo"}.
{"\b\t\n","foo"}
2> shell:strings(false).
true
3> {[8,9,10], "foo"}.
{[8,9,10],[102,111,111]}
不,没有办法禁用它。我发现最好的替代方法是显式打印查询中的值(使用io:format
)或事后 do: io:format("~w\n", [v(-1)])
。
我不认为你可以阻止它。预先添加一个原子似乎是一个杂物——它确实改变了你原来的字符串。
我通常使用 lists:flatten(String) 将其强制为字符串 - 特别是 io_lib:format() 的返回值并不总是打印为字符串。在其上使用 lists:flatten() 使其成为一个。
我使用以下“C风格”:
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
问题是字符串不是 Erlang 中的类型。字符串只是整数列表,因此 shell 无法区分可打印字符串和通用列表。不知道这是否回答了你的问题。