2012-04-21 9 views
5

Cuál es la manera sensata de decir esto.elegante encadenado 'o de para las pruebas sobre una misma variable en Ruby

if @thing == "01" or "02" or "03" or "04" or "05" 

(Los números están contenidos en una columna de cadena de tipo de datos.)

+0

El correcta, pero la versión prolija podrías 'si @thing == "01" || @thing == "02" || ... ' –

+2

Tenga en cuenta que [' y '/' o '* no * es lo mismo que' '&& /' '|| en Ruby] (http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby /). –

Respuesta

11

Hacer una matriz y utilizar .include?

if ["01","02","03","04","05"].include?(@thing) 

Si los valores son en realidad todos consecutivos, se puede utilizar una gama como (1..5).include? Para las cadenas, puede utilizar:

if ("01".."05").include?(@thing) 
+1

O en este caso particular, '("01" .. "05"). Incluyen? (@ Cosa)' –

+0

Si sólo matrices Ruby había búsqueda binaria, esto podría tomar 'O (log n)' 'tiempo en lugar de O (n) 'tiempo. –

+5

@ MДΓΓБДLL:.? Ruby tiene conjuntos, por lo que 'Set.new ("01" .. "05") incluyen' 'sería O (1)'. –

3

O utilizar un caso st atement:

case @thing 
when "01", "02", "03", "04", "05" 
    # do your things 
end 

Dos variaciones de este enfoque:

case @thing 
when "01".."05" 
    # do your things 
end 

case @thing 
when *%w[01 02 03 04 05] 
    # do your things 
end 

Debido a que utiliza case===, también se podría escribir: ("01".."05") === @thing

+1

Bueno, no sabía que podía usar el operador splat en las ramas 'when'. –

+0

El operador '===' es engañoso, en mi humilde opinión, ya que significa algo completamente diferente en otros idiomas donde está disponible. 'include?' es mucho más legible. –

+0

Estoy de acuerdo contigo, nunca lo he usado de esa manera;) –

Cuestiones relacionadas