Erlang Thursday – lists:flatten/1

Erlang Thursday今天要讲的函数是 lists:flatten/1。

lists:flatten/1 函数将一个任意深度的由Erlang的term组成的列表展平为一个“扁平”的列表。

1
2
3
4
5
6
7
8
lists:flatten([]).
% []
lists:flatten([a, b, c]).
% [a,b,c]
lists:flatten([a, b, [1, [x, y], 3], c]).
% [a,b,1,x,y,3,c]
lists:flatten([a, b, [1, [x, {some, tuple}], 3], c]).
% [a,b,1,x,{some,tuple},3,c]

注意!它会把所有的列表都展平,比如下面的例子:

1
2
lists:flatten([a, "foo", b]).
% [a,102,111,111,b]

上面的例子,你得到的结果有整数在列表里,因为字符串实际上在底层就是一个整数列表,所以你得到的是字符串“foo”里f和o的ASCII字符码。

如果你要保留字符串的格式,你必须使用二进制格式的字符串,如下所示:

1
2
lists:flatten([a, <<"foo">>, b]).
% [a,<<"foo">>,b]

作为一个奖励,还有一个lists:flatten/2 函数,它将一个列表展平,并且接收另外一个入参 Tail,这个入参将附加在展平列表的后面从而形成一个新的列表,例子如下:

1
2
lists:flatten([a, [1, [b, [2]]]], [x, y, z]).
% [a,1,b,2,x,y,z]

原文链接: https://www.proctor-it.com/erlang-thursday-lists-flatten-1/