2010-02-18 5 views
7

o incluso mejor puedo hacer yo hash.has_key?('videox') donde x es¿Puedo hacer hash.has_key? ('Vídeo' o 'AUX2') (rubí)

  • '' nada o
  • un dígito?

entonces 'video', 'video1', 'video2' pasaría la condición?

por supuesto que puedo tener dos condiciones, pero en caso de que tenga que utilizar video3 en el futuro las cosas se complican más ...

Respuesta

12

Si desea que el caso general de video seguido de un dígito sin enumerar explícitamente todas las combinaciones. Hay un par de métodos de Enumerable que puede usar en combinación con una expresión regular.

hash.keys es una matriz de las claves de hash y ^video\d$ coincide con el video seguido de un dígito.

# true if the block returns true for any element  
hash.keys.any? { |k| k.match(/^video\d$/ } 

o

# grep returns an array of the matching elements 
hash.keys.grep(/^video\d$/).size > 0 

grep también permitiría capturar la tecla correspondiente (s) si necesita información para la siguiente parte de su código, por ejemplo,

if (matched_keys = hash.keys.grep(/^video\d$/)).size > 0 
    puts "Matching keys #{matched_keys.inspect}" 

Por otra parte, si el prefijo de la clave que estamos buscando es una variable en lugar de una cadena codificado que podemos hacer algo en la línea de:

prefix = 'video' 
# use an interpolated string, note the need to escape the 
# \ in \d 
hash.keys.any? { |k| k.match("^#{prefix}\\d$") } 
+0

hash.keys.any? (& Blk) es la solución perfecta para esto. Puede verificar casi cualquier condición en el bloque, si una cadena tiene una cierta estructura ({| k | k.match (/^video \ d $ /} ), si un objeto de una cierta clase es una clave ({| k | k.is_a? (Numérico)}), ... – severin

+0

@mikej: me gusta la forma en que explicas todo ... ¿podrías agregar también a tu respuesta cómo se vería el código si usamos el nombre de la variable en lugar de la cadena real de "video"? Gracias – Radek

+0

@Radek actualizó la respuesta para mostrar un caso de dónde está el prefijo en una variable. Espero que este es el tipo de cosas que tenía en mente. – mikej

6

Una posibilidad:

hash.values_at(:a, :b, :c, :x).compact.length > 1 
+0

@DigitalRoss: Donde: A ,: ¿bct sería video, video1 etc.? – Radek

+0

Derecha, y en algún momento (1.9?) Array obtuvo un método 'abreviado' que realmente hace exactamente lo que quiere. Creo que sería algo así como 'hash.keys.abbrev 'video'' – DigitalRoss