2010-05-09 20 views
5

general que es mejor usar ?:uso de hash o sentencia CASE [rubíes]

case n 
when 'foo' 
result = 'bar' 
when 'peanut butter' 
result = 'jelly' 
when 'stack' 
result = 'overflow' 
return result 

o

map = {'foo' => 'bar', 'peanut butter' => 'jelly', 'stack' => 'overflow'} 
return map[n] 

Más específicamente, cuando debería utilizar declaraciones de caso y cuándo debo simplemente usar un hash?

+0

Parecen cosas extrañas para comparar. El caso es lógico y el hash es una estructura de datos. ¿Tiene un ejemplo específico en el que está tratando de decidir cuál usar? El contexto ayudará a las personas a proporcionar una respuesta útil. – Greg

+0

Como nota general, la declaración de devolución puede ser (y a menudo es) omitida en los métodos ruby. En el caso de su primer ejemplo, podría eliminar tanto las declaraciones de devolución como la asignación a la variable 'result', suponiendo que no está haciendo nada con' result' que no sea devolverlo. –

+2

A veces uso el enfoque de user94154, aunque se siente un poco raro. No creo que sea una pregunta estúpida. –

Respuesta

11

Un hash es una estructura de datos, y una declaración de caso es una estructura de control.

Debe utilizar un hash cuando solo está recuperando algunos datos (como en el ejemplo que proporcionó). Si hay una lógica adicional que debe realizarse, debe escribir una declaración de caso.

Además, si es necesario realizar alguna coincidencia de patrones, tiene sentido utilizar una declaración de caso:

 

#pattern matching using ranges 
letterGrade = case score 
    when 0..64 then "F" 
    when 65..69 then "D" 
    when 70..79 then "C" 
    when 80..89 then "B" 
    when 90..100 then "A" 
    else "Invalid Score" 
end 

#pattern matching using regular expressions 
case songData 
    when /title=(.*)/ 
    puts "Song title: #$1" 
    when /track=(.*)/ 
    puts "Track number: #$1" 
    when /artist=(.*)/ 
    puts "Artist name: #$1" 
end 

 
8

En general, "mejor" en la programación significa cosas diferentes. Por ejemplo, un mejor programa de

  1. es más fácil de entender, es decir expresa la intención mejor
  2. es más fácil de mantener. Por ejemplo, menos líneas de código, menos propenso a errores, etc.
  3. tiene un mejor rendimiento, en términos de tiempo ejecución
  4. tiene un mejor rendimiento, en términos de uso de memoria

etc

Como estamos hablando de Ruby, el rendimiento suele ser de menor importancia. Si realmente necesita rendimiento, podría considerar otro lenguaje de programación. Entonces, miraría los criterios (1) y (2) primero. El código Ruby que tiene mejor aspecto generalmente representa un programa "mejor". ¿Qué código se ve mejor? ¿Cuál expresa la intención mejor? ¿Cuál sería más fácil de modificar si agrega/elimina la lógica? Depende de tu problema, y ​​es una cuestión de gusto, hasta cierto punto.

Para mí, en su breve ejemplo, la solución hash es mejor. La solución de casos proporciona más flexibilidad, que no necesita en este caso (pero podría necesitar en otros casos).

3

Existen dos diferencias principales entre las tablas hash y las declaraciones de casos.

  1. Una tabla hash se puede almacenar, modificar y reutilizar en el entorno léxico, mientras que una sentencia case no. Produce un resultado y luego desaparece. Sin embargo, tenga en cuenta que si el enunciado de caso está dentro de un bloque/método, puede, por supuesto, usarse varias veces llamando al bloque/método varias veces (pero no modificando fácilmente).
  2. Una expresión literal de tabla hash siempre evalúa todas sus claves y valores, mientras que una sentencia case solo evalúa las "claves" que necesita y el "valor" que va a devolver. Esta suele ser la diferencia más crucial, ya que los valores podrían, como señala Derek B., implicar una lógica adicional, que podría ser muy costoso de realizar innecesariamente si solo se necesita uno de los valores.

.

case n 
when 'foo' 
'bar' 
when 'peanut butter' 
'jelly' 
when 'stack' 
'overflow' 
end 

Eso es equivalente a su código, y después de usar rubí o lenguajes de programación funcionales por un tiempo, aparecerá mucho más natural para usted. También es mucho más corto.

Cuestiones relacionadas