Erlang добавить значение в список в переменной - PullRequest
2 голосов
/ 27 января 2012

У меня есть пустой список, и, в особом случае, я хочу добавить кортеж в список.Как я могу это сделать?

Я попробовал несколько подходов:

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"}]);

, я получаю ошибку соответствия.Как ты обычно делаешь это в Эрланге?

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Обычный способ сделать это в 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(_) -> [].

Не забудьте изменить свое мышление на эрланг! ;)

4 голосов
/ 28 января 2012

Другое решение состоит в том, чтобы использовать тот факт, что 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.

Несмотря на то, что все ветви определяют переменную, компилятор все еще жалуется. Определив переменную вне ее, вы решите проблему.

1 голос
/ 27 января 2012

Я решил это путем извлечения оператора 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...