【问题标题】:Erlang add value to a list in a variableErlang将值添加到变量中的列表
【发布时间】:2012-02-20 12:47:31
【问题描述】:

我有一个空列表,在特殊情况下,我想将一个元组附加到列表中。我该怎么做?

我尝试了几种方法:

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 中你通常是如何做到这一点的?

【问题讨论】:

    标签: list erlang append


    【解决方案1】:

    另一种解决方案是使用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 的条件分支中创建的变量这一事实。

    即使所有分支都定义了变量,编译器仍然会报错。通过在它之外定义变量,您可以解决问题。

    【讨论】:

      【解决方案2】:

      在 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(_) -> [].
      

      不要忘记将您的思维方式转变为 erlang 方式! ;)

      【讨论】:

      • 我肯定会推荐这里使用的方法,您可以使用单独的函数为您构建标题。如果你把它切成这样的小块,代码通常会变得更清晰。
      【解决方案3】:

      我通过将 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)
      

      【讨论】:

        猜你喜欢
        • 2014-08-13
        • 2021-04-14
        • 2023-03-17
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 2017-12-07
        相关资源
        最近更新 更多