Erlang将值添加到变量中的列表中

时间:2012-01-27 14:32:27

标签: list erlang append

我有一个空列表,并且在特殊情况下,想要将一个元组追加到列表中。我怎么能这样做?

我尝试了几种方法:

case ReqFilePath of
    "style.css" ->
        ResponseHeaders = [{"Content-Type", "text/css"}];
    _Else ->
        ResponseHeaders = []
end,


case filelib:is_file(File) of
    true ->
        {ok, Content} = file:read_file(File),
        {output, Content, ResponseHeaders}; % Complains ResponseHeaders is not safe
    false ->
        not_found
end.

这也不起作用,因为已经设置了变量。当我首先初始化ResponseHeaders = []时,然后尝试向其添加值

ResponseHeaders = lists:append(ResponseHeaders, [{"Content-Type", "text/css"}]);

我收到了匹配错误。你如何在Erlang中正常地做到这一点?

3 个答案:

答案 0 :(得分:5)

在erlang中执行此操作的常用方法是使用另一个变量:

ResponseHeaders = [{"Content-Type", "text/css"}],
[...]
ResponseHeaders2 = ResponseHeaders ++ [{new_thing}]

或者您可以创建一个为您构建ResponseHeaders的函数:

ResponseHeaders = build_headers(ReqFilePath).

build_headers("skin.css") -> [{"Content-Type", "text/css"}];
build_headers(_) -> [].

不要忘记改变你的心态到二郎的方式! ;)

答案 1 :(得分:4)

另一种解决方案是使用case ... of是表达式的事实:

ResponseHeaders = case ReqFilePath of
    "style.css" ->
        [{"Content-Type", "text/css"}];
    _Else ->
        []
end,
case filelib:is_file(File) of
    true ->
        {ok, Content} = file:read_file(File),
        {output, Content, ResponseHeaders};
    false ->
        not_found
end.

这应该避免任何抱怨。请注意,我不同意使用函数的建议,但我觉得我应该解释“不安全”问题来自于您使用在case ... of的条件分支内创建的变量这一事实。 / p>

即使所有分支都定义了变量,编译器仍会抱怨。通过在其外部定义变量,您可以解决问题。

答案 2 :(得分:1)

我通过从函数中提取case语句到一个单独的函数来解决这个问题:

get_response_headers(ReqFilePath) ->
    io:format("~p", [ReqFilePath]),
    case ReqFilePath of
        ["skin.css"] ->
            [{"Content-Type", "text/css"}];
        _Else ->
            []
    end.

现在我可以通过致电来获取它们:

ResponseHeaders = get_response_headers(ReqFilePath)