2014-04-29 11 views
16

Sto giocando con Ruby e sto provando a creare un piccolo programma di conto bancario. Quando ho eseguito questa particolare linea di codice che è in esecuzione il withing create_account:Ruby 'is_a?' Classe o modulo richiesto (TypeError)

unless @response.is_a? Integer && @response.to_str.length == 4 
    puts "Your response must be 4 numbers in length." 
    create_account 
else 
    @pin = @response 
    puts "Your pin has been set." 
end 

ottengo questa risposta:

bank_account.rb:24:in 'is_a?':class or module required (TypeError) 
    from bank_account.rb:24:in 'create_account' 
    from bank_account.rb:47:in '<main>' 

non riesco a capire esattamente cosa sta succedendo, ma sto compreso il resto del mio codice. È incompleto, ovviamente perché sono bloccato su questa parte. Passo un ciclo while e inserisco 'Create Account' per avviare il metodo create_account. Il mio obiettivo è quello di eseguire il condizionale e richiedere all'utente di digitare un numero intero a 4 cifre, come qualsiasi numero di pin ole. Se non è un numero intero o 4 cifre di lunghezza, chiamo il metodo create_account per farli ricominciare.

Sto eseguendo Ruby 2.0.0 se tale informazione è necessaria, ma scommetto che probabilmente ha più a che fare con il mio codice. StackOverflow è nuovo per me, quindi mi scuso se questa domanda è stata posta. Ho provato a fare i compiti come consigliato prima di fare una domanda, ma sono ancora perplesso. Qualsiasi aiuto è apprezzato.

risposta

42

è necessario mettere la classe Integer tra parentesi:

unless @response.is_a?(Integer) && @response.to_str.length == 4 

Si sono effettivamente evaulating is_a? su (Integer && @response.to_str.length == 4) che è un valore booleano, non una classe o modulo.

+0

Non mi rendevo conto che includeva l'intera seconda parte del condizionale se non mettevo specificatamente la classe tra parentesi. Grazie. Non riesco ancora a far accettare qualcosa di quattro numeri per qualche motivo, ma un problema alla volta. –

+0

@MarkHJr, se '@ response' è effettivamente un' Integer', quindi non puoi chiamare 'to_str' su di esso, solo' to_s'. Quando provo il tuo test nella console con il valore '454524' ottengo questo messaggio:' NoMethodError: metodo non definito 'to_str 'per 454524: Fixnum'. – maurice

+0

buona risposta e spiegazione! Risolto il mio problema molto velocemente quando avrebbe impiegato molto più tempo. +1 –

Problemi correlati