12 Stimmen

Erlang : Rückgabe aus einer Funktion

Ich habe eine Funktion, in der ich eine Reihe von einzelnen Fallanweisungen habe.

case ... of
     ...
end,

case ... of
     ...
end,

...

usw.

Ich möchte die Funktion sofort verlassen, wenn eine bestimmte Fallbedingung in einer der Fallanweisungen eintritt, so dass die nächste Fallanweisung nicht geprüft wird und die Funktion einfach beendet wird. Wie kann ich das tun?

16voto

jldupont Punkte 87330

Ich würde vorschlagen, Sie refactor, um die volle Leistung von Erlang und seine Musterabgleich Fähigkeiten zu nutzen.

Es gibt keine return Betreiber. Eine wenig bekannte Tatsache ist auch, dass man etwas tun kann wie:

Return=case ... of

a case Anweisung kann einen "Rückgabewert" haben.

12voto

Alan Moore Punkte 1823

Der Musterabgleich ist eine gute Möglichkeit, eine Case-Anweisung zu refaktorisieren - Sie können etwa so vorgehen

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

und dann wird Ihre Fallbeschreibung einfach zu:

X = testcase(Number, Param1, Param2).

(X ist in diesem Beispiel entweder passed1, passed2, passedlarge oder defaultcase)

5voto

Ville Laurikari Punkte 27255

Erlang hat keine return Betreiber. Sie werden Ihren Code in kleinere Funktionen umstrukturieren müssen.

Ihr ursprünglicher Code enthält zwei Case-Ausdrücke, die mit dem Komma-Operator verkettet sind. Ich nehme an, Sie haben einige Nebeneffekte in der ersten case-Ausdruck, die Sie bewahren möchten. Im Folgenden verwende ich einen imaginären return Betreiber:

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

case ... of
  ...
end

Ein solcher Ausdruck kann mit kleinen Funktionen und Mustervergleichen in echten Erlang-Code umgewandelt werden, der in etwa so aussieht:

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

Haftungsausschluss: Es ist 10 Jahre her, dass ich Erlang-Code geschrieben habe, daher kann meine Syntax falsch sein.

2voto

markmywords Punkte 703

In Erlang verwenden Sie einfach den Mustervergleich, um die entsprechende Funktion auszulösen. Wenn Sie zu viele Klauseln abzudecken und zu bearbeiten haben, würde ich auch vorschlagen, den Code ein wenig zu refaktorisieren.

2voto

Zed Punkte 55390

Eine Möglichkeit ist die Kaskadierung der Fallangaben:

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

Eine weitere Möglichkeit besteht darin, Ihre Fallangaben in Klauseln aufzuteilen:

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;

...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X