2012-01-27 46 views
2

我有一個空列表,並且在特殊情況下,希望將元組追加到列表中。我怎樣才能做到這一點?Erlang將值添加到變量中的列表中

我試了幾種方法:

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中你通常如何做到這一點?

回答

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

不要忘了改變你的思想,以erlang的方式! )

+0

我肯定會推薦這裏使用的方法,你有一個單獨的函數來爲你構建標題。如果你把它切成這樣的小塊,代碼通常會變得更清晰。 – 2012-01-27 16:21:16

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) 
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的條件分支中創建的變量。

即使所有分支定義了變量,編譯器仍然抱怨。通過在其外部定義變量,可以解決問題。