Erlang: Возврат из функции

Courier New для меня также, это хорошо расположено с интервалами.

9
задан Christian 8 December 2009 в 14:32
поделиться

6 ответов

Я бы посоветовал вам провести рефакторинг, чтобы использовать всю мощь Erlang и его возможностей сопоставления с образцом.

Не существует оператора return . Кроме того, малоизвестный факт: вы можете сделать что-то вроде:

Return = case ... of

оператор case может иметь «возвращаемое» значение.

15
ответ дан 4 December 2019 в 06:35
поделиться

Erlang не имеет оператор возврата . Вам нужно будет преобразовать ваш код в более мелкие функции.

В исходном коде есть два выражения case, связанных с оператором запятой. Я предполагаю, что у вас есть некоторые побочные эффекты в первом выражении case, которые вы хотите сохранить. Ниже я использую воображаемый оператор return :

case ... of
  P1 -> return E1;
  P2 -> E2;
end,

case ... of
  ...
end

Такое выражение может быть преобразовано в реальный код Erlang с помощью небольших функций и сопоставления с образцом, что-то вроде этого:

case1(P1, ...) -> E1;
case1(P2, ...) -> E2, case2(...).
case2(...) -> ...

Отказ от ответственности: уже 10 лет с тех пор, как я

4
ответ дан 4 December 2019 в 06:35
поделиться

В Erlang вы просто используете сопоставление с образцом для запуска соответствующей функции. Если у вас слишком много пунктов, которые нужно охватить и разобраться, я бы также предложил немного реорганизовать код.

2
ответ дан 4 December 2019 в 06:35
поделиться

используйте catch / throw

Вызывающий говорит:

X = (catch foo(A, B)).

затем напишите

foo(A, B) ->
    case ... of
     ...throw(X) ..
    end,

    case ... of
     ... throw (Y)
    end,
    ...

Это обычно считается плохой практикой программирования, поскольку программа имеет несколько точки выхода, и их трудно найти

1
ответ дан 4 December 2019 в 06:35
поделиться

Один из способов - каскадировать операторы case:

my_fun(X) ->
  case cond1(X) of
    true -> ret1;
    _ ->
      case cond2(X) of
        true -> ret2;
        _ ->
          ...
      end
  end.

Другой - разделить операторы case на предложения:

my_fun(X) ->
  my_fun(cond1, X).

my_fun(cond1, X) ->
  case cond1(X) of
    true -> ret1;
    _    -> my_fun(cond2, X)
  end;

my_fun(cond2, X) ->
  case cond2(X) of
    true -> ret2;
    _    -> my_fun(cond3, X)
  end;

...
2
ответ дан 4 December 2019 в 06:35
поделиться

Сопоставление с образцом - это хороший способ рефакторинга оператора case - вы можете сделать что-то вроде этого

testcase(1, X, Y) -> .... passed1;
testcase(2, X, Y) -> .... passed2;
testcase(N, X, Y) when N > 2 -> .... passedlarge;
testcase(_, X, Y) -> defaultcase.

, а затем ваш оператор case просто завершится до:

X = testcase(Number, Param1, Param2).

(в этом надуманном примере X будет либо передан1, либо передан2, ни передан, либо по умолчанию)

12
ответ дан 4 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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