2009-03-24 14 views
7

Ich habe gerade begonnen, Ruby zu lernen, und ich stieß heute auf ein Problem.Ruby: undefined Methode `> '

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

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

ich diesen Fehler in meiner Ausgabe:

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

Welche wirklich seltsam ist, weil ich eine While-Schleife in IRB gemacht und es hat gut funktioniert. Ich kann den Code innerhalb der Schleife nicht ausführen, da das Programm bei der Bedingung bleibt.

Wer weiß, was los ist?

Antwort

12

numResults ist ein MatchData Objekt und kann nicht mit der > Methode verglichen werden. Sie müssen es in einen String umwandeln, dann die Zeichenfolge in eine Zahl:

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

Versuchen Sie, während Zustand zu ändern zu:

while(numResults.to_i > 0) 

Dies wird die numResults auf eine ganze Zahl erzwingen. Es sieht so aus, als ob es von Ihrem Regexp-Matcher als String zurückgegeben wird.

+1

Leute, die dies abstimmen, sind sich der Tatsache nicht bewusst, dass 'MatchData.to_i' tatsächlich nicht existiert. 'nil.to_i' existiert, aber nicht' MatchData.to_i' –

+0

Funktioniert in 1.9.3 und 2.0.0. Also ist es jetzt gültig. – Hauleth

6

In Fällen, in denen die Zeichenfolge nicht den Ausdruck entspricht, numResultsnil

so, wenn das ist das, was Sie sind Testen Sie

while(!numResults.nil?){ 

} 

In Fällen, in denen die Zeichenfolge den Ausdruck einfügen möchten werde tut übereinstimmen, numResults wird nicht nil und zusätzlich enthält die Anzahl der Übereinstimmungen (nur 1 höchstens hier, weil Sie keine wiederholende Übereinstimmung haben) in numResults.size

Auch andere Plakate müssen daran denken, dass numResults enthält keine Anzahl von Übereinstimmungen gefunden, aber enthält den Wert der tatsächliche Übereinstimmung von den Textdaten.

Während

numResults.to_s.to_i 

funktionieren könnte, seine nur aufgrund der Gnade nil.to_s.to_i == 0.

Wenn Sie sich auf numResults verlassen, um etwas Sinnvolles in Bezug auf Regex Match-Anzahl zu sein, haben Sie an der falschen Stelle gesucht.

+0

Danke Kent, deine Antwort war auch sehr hilfreich. – Dennis