2009-03-24 16 views
7

Acabo de empezar a aprender Ruby y me encontré con un problema hoy.Ruby: método indefinido `> '

numResults = /\d+/.match(ie.div(:id, 'results_label').text) 
puts "Results found: "+numResults.to_s 

while(numResults > 0) 
. 
. some more code 
. 

me sale este error en mi salida:

Exception: undefined method `>' for #<MatchData:0x424c6d4> 

que es realmente extraño, porque hice un bucle while en el IRB y funcionó bien. No puedo ejecutar el código dentro del ciclo porque el programa se atiene a la condición.

¿Alguien sabe qué pasa?

Respuesta

12

numResults es un objeto MatchData y no se puede comparar con el método >. Es necesario para convertirlo en una cadena, a continuación, convertir la cadena en un número:

while(numResults.to_s.to_i > 0) 
-1

trate de cambiar su condición, mientras que:

while(numResults.to_i > 0) 

Esto obligará a los numResults a un entero. Parece que se está devolviendo como una cadena de tu regexp matcher.

+1

Las personas que votan esto no son conscientes del hecho de que 'MatchData.to_i' en realidad no existe. 'nil.to_i' existe, pero no' MatchData.to_i' –

+0

Funciona en 1.9.3 y 2.0.0. Entonces es válido ahora. – Hauleth

6

En los casos en que la cadena no coincide con la expresión, numResults habrá nil

así que si eso es lo que está pruebas para, querrá

while(!numResults.nil?){ 

} 

En los casos en que la cadena hace coincidir con la expresión, numResults no será nil, y, además, contendrá el número de coincidencias (solo 1 como máximo aquí porque no tiene una coincidencia repetitiva) en numResults.size

Además, otros pósters deben tener en cuenta que numResults no contiene ningún número de coincidencias encontradas, pero contiene el valor del real coincide con los datos de texto.

Mientras

numResults.to_s.to_i 

podría funcionar, es sólo debido a la gracia de nil.to_s.to_i == 0.

Si confiabas en numResults para tener algo significativo en términos de recuentos de expresiones regulares, estabas buscando en el lugar equivocado.

+0

Gracias Kent, tu respuesta también fue muy útil. – Dennis

Cuestiones relacionadas