【问题标题】:Erlang: DRYing up string+binary concatenationErlang:干燥字符串+二进制连接
【发布时间】:2016-09-30 08:04:48
【问题描述】:

我目前正在从这样的字符串和二进制文件中形成字符串:

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

这看起来既痛苦又混乱。因为为了用另一个具有不同数量“~n”的字符串来干掉这个:

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>

【问题讨论】:

  • 你为什么要格式化字符串而不是将它们连接在一起?
  • @JustinNiessner 抱歉,我遗漏了一个关键细节,我的错。这就是我尝试制作 MWE 的结果。
  • 我已经用另一种可能的解决方案更新了我的答案。

标签: string erlang


【解决方案1】:

我很困惑为什么您需要致电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">>]).

【讨论】:

  • 抱歉,我编辑了我的问题。我的一些列表元素是二进制文件。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2015-08-22
  • 2012-04-16
  • 1970-01-01
  • 2012-03-14
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多