2012-01-27 10 views
2

私は空のリストを持っていますが、特別なケースではリストにタプルを追加したいと思います。どうやってやるの?変数のリストに値を追加する

私はいくつかのアプローチを試してみました:

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の道にあなたの考え方を変更することを忘れないでください!

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. 

そして、それはどんな文句を回避する必要があります。;)

+0

ここでは、ヘッダーを作成するための別の機能がある場合は、ここで使用する方法をお勧めします。このような小さな断片にカットすれば、コードはしばしばはっきりします。 –

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が式であるという事実を使用することです。関数を使用するという提案には同意しませんが、「安全でない」問題は、case ... ofの条件分岐内で作成された変数を使用しているという事実から来ていると説明する必要があると感じました。

すべてのブランチが変数を定義していても、コンパイラはまだ文句を言います。変数を変数の外側に定義することで、問題を解決できます。

関連する問題