2015-07-06 10 views
6

So di Ruby supporta un suffisso if come:Qual è lo scopo dell'uso dell'istruzione suffisso "if" in Ruby?

number = -42 if opposite 

ma qual è lo scopo di questo? Perché dovrebbe essere utilizzato al posto della dichiarazione del prefisso if?

+0

Penso che questa forma di assegnazione "intelligente" sia brutta, ma rende in altri casi: "rilancia qualcos'altro se qualcosa non va". – user2864740

+0

Ruby ce l'ha perché Perl ce l'ha, perché Perl (AFAIK) a volte legge meglio. –

+2

@ user2864740, sono completamente d'accordo con te. Ricordo di aver letto la frase, "Va tutto bene se tutto va bene.", E pensando a quanto sarebbe stato meglio "Se tutto finisce bene, va tutto bene". –

risposta

1

È uguale al prefisso ma più breve. L'unica ragione è di salvare lo spazio verticale nell'editor di testo.

3

In alcuni casi è possibile semplificare la lettura del codice. Trovo che questo sia vero soprattutto nel caso di unless, dove si ha una certa azione si solito desidera eseguire:

number = -42 unless some_unusual_circumstance_holds 

Una volta che avete per unless, per la simmetria ha senso per sostenerlo per if anche.

+0

Non capisco perché tu menzioni "se" solo indirettamente Se hai "a meno" per le cose che di solito vuoi supportare, allora hai "se" per le cose che in via eccezionale vuoi supportare. – sawa

3
number = -42 if opposite 

è lo stesso di

if opposite 
    number = -42 
end 

Alcune persone preferiscono l'one-liner, per motivi di leggibilità. Immaginate una riga del tipo:

process_payment if order_fulfilled? 

Non leggere bene?

6

Il suffisso stile if e unless può anche essere un bene per "clausole di guardia", sotto forma di:

return if ... 
return unless ... 

Ecco un esempio:

# suffix-style 
def save 
    return false if invalid? 
    # go for it 
    true 
end 

Versus:

# indented style 
def save 
    if valid? 
    # go for it 
    true 
    else 
    false 
    end 
end 

Nel secondo esempio, l'intera implementazione del metodo non ha o essere spostato di un trattino a causa del controllo valid?, e abbiamo bisogno di una clausola aggiuntiva else. Con lo stile suffisso, il controllo invalid? è considerato un caso limite che gestiamo e quindi eseguiamo il salvataggio, e il resto del metodo non ha bisogno di un rientro o di una clausola else.

Questo è talvolta chiamato una "clausola di guardia" ed è recommended dalla Guida allo stile di Ruby.

+0

@vgoff Ho modificato la mia risposta per chiarire che il codice di esempio dovrebbe restituire valori diversi per i percorsi di codice validi e non validi. –

2

Lo stile Postfix non ha la sezione else. È utile quando vuoi solo fare qualcosa con uno dei due casi diviso per la condizione e non vuoi scherzare con l'altro caso.