2016-01-06 8 views
5

Ho un metodo che assumono un solo parametro:definire le condizioni su parametri di un metodo

def my_method(number) 

end 

Come posso alzare un errore se il metodo viene chiamato con un number < 2? E in generale, come posso definire le condizioni sul parametro di un metodo?

Per esempio, voglio avere un errore al momento della chiamata:

my_method(1) 
+2

Non si può mettere tali vincoli direttamente nella definizione dei parametri. Puoi fare un controllo nella prima riga del corpo del metodo: 'raise: qualunque cosa se numero <2'. – ndn

+0

@ndn, mi permetto di dissentire. Per favore vedi la mia risposta. –

risposta

6

È possibile aggiungere guard all'inizio della funzione e generare un'eccezione se gli argomenti non sono validi. Per esempio:

def my_method(number) 
    fail ArgumentError, "Input should be greater than or equal to 2" if number < 2 

    # rest of code follows 
    # ... 
end 

# Sample run 
begin 
    my_method(1) 
rescue => e 
    puts e.message 
end 
#=> Input should be greater than or equal to 2 

Si potrebbe definire custom exception classe se non si desidera utilizzare il ArgumentError


Se si sta costruendo qualcosa di simile a un quadro, poi, si può fare uso di meta- tecniche di programmazione per intercettare le invocazioni dei metodi e applicare alcune convalide. Fare riferimento a Executing code for every method call in a Ruby module. Potrebbe essere necessario creare una sorta di DSL per esprimere tali convalide: un tipico esempio di convalida DSL è Active Record Validations in Rails.

In breve, per casi di utilizzo quotidiano, è sufficiente il numero di serie raise (or fail) e rescue. Le meta- grammazioni e le convalide basate su DSL sono necessarie solo se si sta costruendo un framework per scopi generali.

+1

Non è necessario chiamare 'new', basta passare la classe di eccezione e il messaggio, cioè 'raise ArgumentError," Input dovrebbe essere ... "' (o 'fail' in base alla guida in stile Ruby) – Stefan

+0

@Stefan Molte grazie. Ho aggiornato il codice. Apprezzo gli input che continui a lasciare sui vari post. –

1

Dovrete controllare le condizioni ed aumentare all'interno metodo corpo. Non c'è un'opzione integrata come vuoi tu.

1

Si potrebbe fare questo:

def my_method arg, dummy = (raise ArgumentError, "arg < 2" if arg < 2) 
    puts "arg=#{arg}" 
end 
my_method 3 
    # arg=3 
my_method 1 
    # ArgumentError: arg < 2 
+0

No ... Cary ... Sai che questo è solo il male. (: – ndn

+1

@ndn, nella mia esperienza, le risposte cattive sono spesso trascurate. –

Problemi correlati