2009-03-24 22 views
7

Je viens de commencer à apprendre Ruby et j'ai rencontré un problème aujourd'hui.Ruby: méthode non définie `> '

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

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

Je reçois cette erreur dans ma sortie:

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

Ce qui est vraiment étrange parce que je fait une boucle while en CISR et il a bien fonctionné. Je n'arrive pas à exécuter le code à l'intérieur de la boucle car le programme s'en tient à la condition.

Quelqu'un sait ce qui ne va pas?

Répondre

12

numResults est un objet MatchData et ne peut pas être comparé à la méthode >. Vous devez le convertir en une chaîne, puis convertir la chaîne en nombre:

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

Essayez de changer votre état while à:

while(numResults.to_i > 0) 

Cela forcera les numResults à un nombre entier. On dirait qu'il est retourné comme une chaîne de votre matcher regexp.

+1

Les personnes qui votent pour cela ne savent pas que 'MatchData.to_i' n'existe pas. 'nil.to_i' existe, mais pas' MatchData.to_i' –

+0

Fonctionne en 1.9.3 et 2.0.0. Donc c'est valide maintenant. – Hauleth

6

Dans les cas où la chaîne ne correspond pas à l'expression, numResults sera nil

donc si c'est ce que vous test pour, vous aurez envie

while(!numResults.nil?){ 

} 

Dans les cas où la chaîne exerce ses correspondre à l'expression, numResults ne sera pas nil, et en outre, contiendra le nombre de correspondances (seulement 1 au plus ici parce que vous n'avez pas de correspondance répétitive) dans numResults.size

Aussi, d'autres affiches doivent garder à l'esprit que numResults ne contient aucun nombre de correspondances trouvées, mais contient la valeur du réelle correspondre à partir des données de texte.

Alors que

numResults.to_s.to_i 

pourrait fonctionner, sa seule raison de la grâce de nil.to_s.to_i == 0.

Si vous comptiez sur numResults être quelque chose de significatif en termes de nombre de match de regex, vous cherchez au mauvais endroit.

+0

Merci Kent, votre réponse a également été très utile. – Dennis