Как мне элегантно проверить многие условия в Эрланге?

У меня была такая же проблема. Я получал ошибку, когда пытался запустить в своем устройстве Android не эмулятор.

sudo ionic run android 

Я могу исправить это, запустив

adb uninstall com.mypackage.name
13
задан ryeguy 20 March 2009 в 13:34
поделиться

2 ответа

Одно из предложения Joe Armstrong: код случая успеха программы разделяется от обработки ошибок. Можно сделать его таким образом

create_user(Email, UserName, Password) ->
  try
    ok = new_email(Email),
    ok = valid_user_name(UserName),
    ok = new_user(UserName),
    ok = strong_password(Password),
    ...
    _create_user(Email, UserName, Password)
  catch
    error:{badmatch, email_in_use} -> do_something();
    error:{badmatch, invalid_user_name} -> do_something();
    error:{badmatch, user_exists} -> do_something();
    error:{badmatch, weak_password} -> do_something();
    ...
  end.

примечание, что можно сделать все ошибочные выгоды из функции create_user, которая лучше.

create_user(Email, UserName, Password) ->
    ok = new_email(Email),
    ok = valid_user_name(UserName),
    ok = new_user(UserName),
    ok = strong_password(Password),
    ...
    _create_user(Email, UserName, Password).

main() ->
  try
    ...
    some_function_where_create_user_is_called(),
    ...
  catch
    ...
    error:{badmatch, email_in_use} -> do_something();
    error:{badmatch, invalid_user_name} -> do_something();
    error:{badmatch, user_exists} -> do_something();
    error:{badmatch, weak_password} -> do_something();
    ...
  end.

соответствие Шаблона является одной из самых прохладных вещей в Erlang. Обратите внимание, что можно включить тег к badmatch ошибке

{my_tag, ok} = {my_tag, my_call(X)}

и пользовательские данные также

{my_tag, ok, X} = {my_tag, my_call(X), X}

, Если исключение достаточно быстро для Вас, зависит Ваших ожиданий. Скорость на моем Core2 Duo Intel на 2.2 ГГц: приблизительно 2 миллиона исключений через одну секунду (0.47us) по сравнению с 6 миллионами успехов (внешние) вызовы функции (0.146us) - можно предположить, что обработка исключений сопровождает 0.32us. В собственном коде это 6.8 по сравнению с 47 миллионами в секунду, и обработка может сопроводить 0.125us. Может быть некоторая дополнительная стоимость для конструкции выгоды попытки, которая составляет приблизительно 5-10% к вызову функции успеха и в собственном компоненте и в байт-коде.

32
ответ дан Hynek -Pichi- Vychodil 20 March 2009 в 23:34
поделиться
  • 1
    Если да, то остановите текущую загрузку и удалите строку.. – Ronnie 23 July 2012 в 10:07
User = get_user(),

Check_email=fun(User) -> not is_valid_email(User#user.email) end,
Check_username=fun(User) -> is_invalid_username(User#user.name) end,

case lists:any(fun(Checking_function) -> Checking_function(User) end, 
[Check_email, Check_username, ... ]) of
 true -> % we have problem in some field
   do_panic();
 false -> % every check was fine
   do_action()
 end

, Таким образом, это не 5 уровней глубоко больше. Для реальной программы я предполагаю, что необходимо использовать lists:foldl для, накапливают сообщение об ошибке от каждой функции проверки. Поскольку на данный момент это простой говорит 'весь штраф' или 'некоторую проблему'.

Примечание, которые таким образом добавляют или удаляют условие проверки, не является грандиозным предприятием

, И для "Там эквивалент оператора возврата..." - смотрят на оператор броска выгоды попытки, бросают действия как возврат в этом случае.

4
ответ дан JLarky 20 March 2009 в 23:34
поделиться
  • 1
    @userSeven7s CursorLoader только заботы о базе данных SQLite... это doesn' t знают, как данные вставляются/удаляются, и при этом они не заботятся. Используя Loader с является самым легким и наиболее удобным способом загрузить данные из базы данных SQLite. IIRC, для предотвращения " база данных locked" исключения, которые все, что действительно необходимо сделать, использовать одиночный элемент SQLiteDatabase экземпляр для выполнения доступов базы данных , который Вы могли легко получить и использовать в Service. – Alex Lockwood 24 July 2012 в 15:46
Другие вопросы по тегам:

Похожие вопросы: