2010-12-01 22 views
12

Tengo 2 partes de código que quiero ejecutar. Ambos son condicionalesErlang equivalente a if else

if Value1 < N do something 

else if Value1 >= N do something 

if Value2 < N do something 

else if Value2 >= N do something 

Quiero una declaración de cada uno para ejecutar.

¿Cómo funciona el si funciona en erlang? no hay más Uso múltiples guardias, pero parece que tengo 4 declaraciones if. en grupos de 2.

if some condition 
code; 

if other condition 
code 

end. 

Aparece un error de sintaxis.

+0

He descubierto que si confía en guardias o declaraciones de casos, probablemente esté "haciéndolo mal" __ la mayoría de las veces en Erlang. Probablemente deberías estar haciendo la coincidencia de patrones la mayoría de las veces en Erlang como una alternativa a las guardias y las declaraciones de casos. Sin un ejemplo concreto, no podemos decirle si debería estar haciendo una coincidencia de caso, guardia o patrón, pero la coincidencia de patrones es __siempre__ escribir en comparación con las alternativas. –

+0

posible duplicado de [Cómo implementar if-else] (http://stackoverflow.com/questions/963918/how-to-implement-if-else) –

Respuesta

18

La forma para una if es:

if 
    <guard 1> -> <body1> ; 
    <guard 2> -> <body2> ; 
    ... 
end 

Funciona probando las guardias en if-clauses en orden descendente (esto se define) hasta que llega a una prueba que tiene éxito, luego se evalúa el cuerpo de esa cláusula y la expresión if devuelve el valor de la última expresión en el cuerpo. Así que el bit else en otros idiomas se hornea en él. Si ninguna de las guardias tiene éxito, se genera un error if_clause. Un guardia común de todos es solo true que siempre tiene éxito, pero un catch-all puede ser cualquier cosa que sea verdad.

La forma de case es:

case <expr> of 
    <pat 1> -> <body1> ; 
    <pat 2> -> <body2> ; 
    ... 
end 

Funciona mediante la primera evaluación y luego tratar de coincidir con el valor con los patrones en el asunto de las cláusulas con el fin op-abajo (esto se define) hasta que una coincide , entonces el cuerpo de esa cláusula es evaluado y la expresión case devuelve el valor última expresión en el cuerpo. Si no coincide ningún patrón, se genera un error case_clause.

Tenga en cuenta que if y case son expresiones (todo es una expresión) por lo que ambos deben devolver valores. Esa es una razón por la cual no hay un valor predeterminado si nada tiene éxito/coincide. También para forzarte a cubrir todas las opciones; esto es especialmente importante para case. if es solo un caso degenerado de case por lo que lo heredó. Hay un poco de historia de if en Erlang Rationale que puede encontrar en trapexit.org bajo contribuciones de los usuarios.

13

Erlang no le permite tener un if sin una opción de declaración true. Si esto es algo que es una declaración verdadera o un true real depende de usted, pero es común que su true sea el else en otros idiomas.

if 
    some_condition -> some_code; 
    some_other_condition -> some_other_code; 
    true -> else_code 
end. 

See the "What the If?" sección en this página para más información sobre esto.

+4

Ciertamente permite tener un 'if' sin un' true 'branch, y lanzará una excepción en tiempo de ejecución en este caso. –

+1

Por lo tanto, "erlang no permite que el juguete tenga un' si' sin una opción de declaración 'verdadera'.". Si nada se evalúa como 'verdadero ', obtendrá una excepción. –

+4

Pero obtener una excepción ES bueno. Significa que un caso no pasó por lo que planeó. Se podría argumentar que atrapar todas las cláusulas de "otros" es tan malo como capturar todas las excepciones a ciegas: si X> 0 -> ...; X < 0 -> ...; X =: = 0 -> ... fin. Es más explícito y seguro que usar 'verdadero' para la última cláusula. –

5

En primer lugar, recomiendo que se acostumbre a utilizar 'caso' comunicado, a causa de 'si' condiciones restringidas para proteger las expresiones:

case custom_call(A) of 
    1 -> do1(A); 
    2 -> do2(A) 
end. 

No es una forma más de hacer la ejecución condicional, además de ' si' y el 'caso' que funciona a partir de R13:

1> N =10. 
    10 
    2> ((N > 10) andalso more).  
    false 
    3> ((N == 10) andalso equals). 
    equals 
+0

Si utilizo una funda, ¿no saldrá cuando coincida con algún caso? ¿O ejecutará ese caso y avanzará para intentar hacer coincidir el segundo? – jarryd

+0

No hay ninguna razón para utilizar ciegamente el caso ... de ... fin en lugar de si. Si su cheque puede limitarse a guardias, use 'si'. De lo contrario, estás complicando inútilmente tu código con cláusulas de coincidencia vacías en un 'caso'. –

+0

Ok, pero mi pregunta permanece. ¿Saldrá el código de las sentencias if si ejecuta una? ¿O ejecutará la declaración y pasará al siguiente guardia? Necesito un código para ejecutar dependiendo del valor. y luego tengo otro método que debería hacer lo mismo dependiendo de otro valor. Primero, si es Value> = queue: len y el else debe ser Value jarryd

5

Recuerde if en Erlang tiene un valor que devolver, y es una expresión.Es no que if como en C o Java.

Si desea hacer algo por un valor, el código debería ser algo como esto;

if 
    % do something and get the value 
    X >= Val -> Something; 
    % for doing something otherwise and get the value 
    true -> Else_than_the_Something 
end. 

Ver Section for the if expression of Erlang Reference Manual para más detalles.