Erlang:DRYing up string + binary concatenation

时间:2016-09-28 20:25:17

标签: string erlang

我目前正在从字符串和二进制文件中形成字符串,如下所示:

X = string:join(io_lib:format("~s~s~s", ["something1", "something2",<<"something3">>]), "") %X is now something1something2something3

这看起来很痛苦而且很混乱。因为为了用另一个具有不同数量的&#34; ~n&#34;

的字符串来干这个。
Y = string:join(io_lib:format("~s~s", ["something1", <<"something2">>]), "")

我基本上必须编写一个计算参数列表大小的函数,并形成~n[that many times]并将其插入到此中。

有更好的方法吗?

Eshell V8.0.2 (abort with ^G) 1> F = <<"asdf">>, 1> string:join(io_lib:format("~s~s~s", ["something1", "something2", F]),""). "something1something2asdf" 2> lists:flatten(["something1", "something2", F]). [115,111,109,101,116,104,105,110,103,49,115,111,109,101,116, 104,105,110,103,50,<<"asdf">>] 3>

1 个答案:

答案 0 :(得分:4)

我很困惑为什么你需要拨打io_lib:format。在这种情况下,它没有做任何工作。

string:join(["something1","something2","something3"], "").

会给你相同的结果。如果真的没有分隔符(并且利用字符串只是Erlang中的列表这一事实),你可以进一步简化:

lists:flatten(["something1", "something2", "something3"]).

<强>更新

我现在看到您正在处理不同数据类型的列表。虽然单线可能看起来很漂亮,但您可以看到它们并不总是灵活的。在您的情况下,我将创建一些映射器函数来处理将不同类型映射到字符串。也许是这样的:

-module(string_utils).
-export([concat/1]).

to_string(Value) when is_binary(Value) -> binary_to_list(Value);
to_string(Value) -> Value.
concat(List) ->
  lists:flatten(lists:map(fun to_string/1, List)).

然后你的调用代码将是:

string_utils:concat(["something1", "something2", <<"something3">>]).