我认为这个问题与询问如何检查值是否为io_list
是一样的。我希望它尽可能高效,因此不希望将值转换为二进制文件,作为检查它是否为io_list的过程的一部分。
答案 0 :(得分:1)
在浏览了Erlang的stdlib之后,我相信您最好的选择是使用:erlang.iolist_size
并抓住ArgumentError
来检测无效的iolists。
iolist? = fn x ->
try do
:erlang.iolist_size(x)
true
rescue
ArgumentError -> false
end
end
IO.inspect iolist?("foo")
IO.inspect iolist?(["foo"])
IO.inspect iolist?(:foo)
输出:
true
true
false
在我非常不科学的基准测试中,这大约是:erlang.iolist_to_binary/1
的三倍。
iolist = List.duplicate([[[1, "2"], '3'], ?4], 1000000)
IO.inspect :timer.tc(:erlang, :iolist_to_binary, [iolist])
IO.inspect :timer.tc(:erlang, :iolist_size, [iolist])
{82291,
<<1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1,
50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1,
50, 51, 52, 1, 50, 51, 52, 1, ...>>}
{25577, 4000000}