Проверьте, был ли параметр отправлен функции

#erlang

#erlang

Вопрос:

У меня следующий случай: на мой сервер отправляется запрос, и я анализирую некоторые параметры GET, чтобы правильно его обработать. После анализа запроса я получаю что-то вроде:

 some_function(parameter1, parameter2, ...) ->
    some_steps_here.
  

Идея в том, что я хочу иметь возможность возвращать хорошие коды ошибок, если некоторые из этих параметров отсутствуют. Например, если пользователь не ввел parameter1 свой URL-адрес, я хочу вернуть ошибку вместо выполнения some_steps_here .

Пытался решить это с помощью сопоставления с образцом, но понятия не имею, как это сделать вообще.

Комментарии:

1. Какое именно значение вы передадите, как parameter1 если бы пользователь «не вводил параметр1 в свой URL»? Пустая строка? пустой двоичный файл? ноль? что-то еще?

2. Я его проанализировал как undefined . Итак, что я пытался сделать, это: some_function(param1, param2) when param1 == undefined -> Msg = util:format("Looks like ~p is missing", [param1]), response:send({502, Msg}, Req); some_function(param1, param2) -> main_handler_here

Ответ №1:

Во-первых, если вы пишете param1 и param2 строчными буквами, это означает atom , что а не параметр. Вы хотите, чтобы ваша функция была:

 some_function(Param1, Param2, ...)
  

Что касается вашего вопроса, я бы предложил использовать предложения функций, чтобы уловить случай, когда Param1 == undefined , например

 some_function(undefined, _Param2, ...) ->
    io:format("Param1 is undefined~n");
some_function(_Param1, undefined, ...) ->
    io:format("Param2 is undefined~n");
some_function(Param1, Param2, ...) ->
    io:format("Params are OK!~n").
  

Каждое предложение разделяется ; символом, а последнее предложение заканчивается точкой . .

Обновить:

Отвечая на комментарий ниже: есть ли способ сделать его более общим?

Это действительно зависит от вашей реализации. Вам нужно подумать, каков ваш желаемый ввод, и если вы не получите желаемый ввод, что вы получите? Конкретный атом? Просто случайный атом вместо списка? Ниже я добавил некоторые другие параметры, которые вы также можете использовать. И, пожалуйста, взгляните на Learn You Some Erlang, вы, вероятно, найдете там все свои ответы.

Вы можете использовать guards для проверки определенного типа:

 some_function(Param1, ...) when is_atom(Param1) -> 
    ...
some_function(Param1, ...) -> ...
  

Или, case .. of чтобы проверить что-то конкретное:

 some_function(Param1, Param2, ...) ->
    case Param1=:=7 andalso is_list(Param2) of
        true  -> something;
        false -> something_else
    end.
  

Пожалуйста, посмотрите Это и это для получения дополнительной информации и примеров.

Комментарии:

1. Есть ли способ сделать его более общим? Например. Я не хочу писать 4 одинаковые функции. Особенно с учетом того, что они возвращают почти одинаковые результаты

2. @OlegTarasenko Пожалуйста, посмотрите мою правку. Кроме того, пожалуйста, взгляните на ссылки, на которые я ссылался в своем ответе.