2009-03-24 8 views
7

Ho appena iniziato a studiare Ruby e oggi ho avuto un problema.Ruby: metodo non definito `> '

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

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

ottengo questo errore nel mio uscita:

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

Che è davvero strano perché ho fatto un ciclo while in IRB e ha funzionato bene. Non riesco a ottenere il codice all'interno del ciclo da eseguire perché il programma si attacca alle condizioni.

Qualcuno sa cosa c'è che non va?

risposta

12

numResults è un oggetto MatchData e non può essere confrontato con il metodo >. È necessario convertire in una stringa, quindi convertire la stringa in un numero:

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

provare a cambiare la sua condizione, mentre a:

while(numResults.to_i > 0) 

Questo costringerà i numResults ad un numero intero. Sembra che venga restituito come stringa dal tuo regexp matcher.

+1

Le persone che votano su questo non sono consapevoli del fatto che "MatchData.to_i' in realtà non esiste. 'nil.to_i' esiste, ma non' MatchData.to_i' –

+0

Funziona in 1.9.3 e 2.0.0. Quindi è valido ora. – Hauleth

6

Nei casi in cui la stringa non corrisponde all'espressione, numResults sarà nil

quindi se questo è ciò che si sta test per, si vorrà

while(!numResults.nil?){ 

} 

Nei casi in cui la stringa fa corrispondere l'espressione, numResults non sarà nil, e, inoltre, conterrà il numero di partite (solo 1 al massimo qui perché non si dispone di un match ripetizione) in numResults.size

Inoltre, altri manifesti hanno bisogno di tenere a mente che numResults contiene nessun numero di corrispondenze trovate, ma contiene il valore del effettivo corrispondenza dai dati di testo.

Mentre

numResults.to_s.to_i 

potrebbe funzionare, la sua solo per la grazia di nil.to_s.to_i == 0.

Se ti fidi di numResults per essere qualcosa di significativo in termini di conteggio delle espressioni regolari, stavi cercando nel posto sbagliato.

+0

Grazie Kent, la tua risposta è stata molto utile. – Dennis