我有一个空列表,在特殊情况下,我想在列表中附加一个元组。我该怎么做?
我尝试了几种方法:
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中执行此操作的常用方法只是使用另一个变量:
ResponseHeaders = [{"Content-Type", "text/css"}],
[...]
ResponseHeaders2 = ResponseHeaders ++ [{new_thing}]
或者你可以制作一个为你构建ResponseHeaders的函数:
ResponseHeaders = build_headers(ReqFilePath).
build_headers("skin.css") -> [{"Content-Type", "text/css"}];
build_headers(_) -> [].
别忘了改变你的心态,以二郎的方式!)
另一个解决方案是使用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
的条件分支中创建的变量。
即使所有分支都定义了变量,编译器仍然会抱怨。通过定义它之外的变量,就可以解决问题。
我通过将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)