2011-08-26 11 views
16

Quello che sto cercando di fare:Ruby: sintassi condizionale multilinea: come si fa?

result = (not question?) \ 
      and (\ 
      condition \ 
      or (\ 
       comparer == compared and another_question? \ 
      ) \ 
     ) 

L'obiettivo è quello di avere complicato e/o la logica e avere ancora che sia leggibile.

Il problema con il tentativo di sintassi di cui sopra è che in qualche modo scombina parentesi nella parser di rubino, in modo console dice che l'errore è in un file che questo codice non è in. (Anche se è nello stack di chiamate)

senza le barre rovesciate, ottengo questi:

syntax error, unexpected kAND, expecting kEND (SyntaxError) 

e

syntax error, unexpected kOR, expecting ')' 

tutte le idee su come fare correttamente questo?

+0

Nell'esempio, c'è uno spazio dopo "another_question"? \ '. Lo spazio esiste nel codice originale? – outis

+0

sì, gli spazi sono importanti? – NullVoxPopuli

+0

Molto molto. "\" sfugge al seguente carattere. – outis

risposta

18

Rimuovere lo spazio dopo il backslash in another_question? \. Stai sfuggendo allo spazio anziché alla nuova riga, il che causa un errore di sintassi.

Nota che non è necessario sfuggire a ogni nuova riga.

result = (not question?) \ 
      and (
      condition \ 
      or (
       comparer == compared and another_question? 
      ) 
     ) 
8

Assicurarsi che ogni riga (tranne l'ultima) termini con un operatore in modo che l'interprete "sappia" che ci saranno più operandi in arrivo, ad es.

result = (not question?) and (
       condition or 
       (comparer == compared and another_question?) 
     ) 

(testato con la risonanza magnetica 1.8.7)

+0

non c'è modo di avere gli operatori su una nuova linea? – NullVoxPopuli

+2

@TheLindyHop: Sì, mascherando le interruzioni di riga con barra rovesciata ;-) Non conosco altre possibilità. Forse potresti rielaborare il codice per evitare espressioni logiche eccessivamente complesse? –

8

Prova questa:

sub = (comparer == compared and another_question?) 
result = (not question?) and (condition or sub) 

Non c'è bisogno di rendere il tutto una delle espressioni.

+1

Tendo ad interrompere lunghe espressioni booleane in metodi che nominano (e delegano a) gli aspetti dell'espressione, assegnando nomi leggibili che esprimono ciò che viene testato. – d11wtq

+1

@ d11wtq Anche i metodi a una riga non sono leggibili! Immagina di tornare nel tuo codice e vedere decine di metodi in una dichiarazione if, e dover rintracciare ogni metodo per scoprire cosa fa.I metodi dovrebbero essere estratti solo se saranno utilizzati in più posizioni. – Chloe

11

Per l'espressione logica, si dovrebbe usare &&, ||, !, non and, or, not.

and, or, not devono essere utilizzati solo per il controllo del flusso.

Una ragione è che &&, ||, ! hanno precedenza maggiore rispetto and, or, not.

Maggiori informazioni su questo in this blog post.

Problemi correlati