2012-09-11 13 views
14

Estilo 1:¿Cuál es más preferible? ¿Guardia o estuche?

a(X) when X>1 -> 
    ...omitted; 
a(X) when X -> 
    ...omitted. 

Estilo 2

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

actualización ==== ===

Como dijo @rviding, actualizo la comparación de la siguiente manera:

Estilo 1:

a(X) when X>1 -> 
    ...omitted; 
a(X) -> 
    ...omitted. 

estilo 2

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

Respuesta

14

Learn You Some Erlang's section on function syntax estados que funcionan cláusulas y declaraciones de casos son básicamente los mismos, excepto por una diferencia: la coincidencia de patrones en las cláusulas puede manejar más de un patrón, mientras que una declaración de caso sólo puede manejar un comunicado.

Aparte de eso, creo que es una cuestión de gusto. Tiendo a usar diferentes cláusulas de funciones cuando los casos son realmente distintos (como en: la función completa se comportará de manera diferente), y utilizo declaraciones de casos cuando quiero que el código diverja y se fusione después de nuevo, p. para calcular el valor de una variable en función de una expresión.

Editar Como ha señalado RobertAloi en los comentarios a continuación, usted no está realmente limitado cuando se utiliza case .. of. Además, como escribió rvirding, el compilador hace algo de optimización al envolver diferentes expresiones en una tupla para permitir la comparación con ellas.

+0

Gracias. Personalmente cuido las cláusulas de función, ya que es más claro. Su consejo es lo suficientemente bueno para hacerme tomar la decisión. – goofansu

+4

Las cláusulas de función también son mejores para depurar, ya que puede rastrearlas – Lukas

+2

@goofansu, pero en este caso evite la protección 'when X'. Solo tendrá éxito si 'X' tiene el valor' true'. – rvirding

6

También debe considerar que probar el resultado de un BIF no tiene exactamente el mismo comportamiento en un guardia que dentro de una función.

Me enteré de esto recientemente, por ejemplo (length(L) > -1) cuelga dentro de una función pero no en una guardia cuando L es una lista incorrecta.

+0

Gracias por la advertencia – goofansu

Cuestiones relacionadas