我目前正在从字符串和二进制文件中形成字符串,如下所示:
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>
答案 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">>]).