2012-03-15 11 views
6

mi sono imbattuto in un ternario in qualche codice e sto avendo difficoltà a capire il condizionale:Come leggi questa condizione ternaria in Ruby?

str.split(/',\s*'/).map do |match| 
    match[0] == ?, ? 
    match : "some string" 
end.join 

Capisco che sto suddivisione di un testo in alcuni punti e convertendo il risultato complessivo a un array, e si occupano di ogni elemento della matrice a turno. Oltre a questo non ho idea di cosa stia succedendo.

risposta

7

A (leggermente) meno confusione modo di scrivere questo è:

str.split(/',\s*'/).map do |match| 
    if match[0] == ?, 
    match 
    else 
    "some string" 
    end 
end.join 

Penso dichiarazioni ternari multilinea sono orribili, soprattutto perché if blocchi possono tornare in Ruby.

Probabilmente la cosa più confusa qui è il ?, che è un carattere letterale. In Ruby 1.8 significa il valore ASCII del carattere (in questo caso 44), in Ruby 1.9 questa è solo una stringa (in questo caso ",").

Il motivo dell'utilizzo di un carattere letterale anziché solo "," è il valore restituito della chiamata [] su una stringa modificata in Ruby 1.9. In 1.8 it returned the ASCII value of the character at that position, in 1.9 it returns a single-character string. Utilizzando ?, qui evita di doversi preoccupare delle differenze in String#[] tra Ruby 1.8 & 1.9.

definitiva il condizionale è solo controllando se il primo carattere in match è ,, e se così mantiene il valore della stessa, altrimenti lo imposta a "some string".

+0

Grazie a @AndrewMarshall, sarebbe stato utile se fosse 'match == (?,)? match: "some string" '? O vorrebbe dire qualcos'altro? – ismail

+0

@IsmailTabtabai Sarebbe lo stesso. Ogni volta che faccio affermazioni ternarie di solito avvolgo l'intera istruzione condizionale tra parentesi per chiarire dove si trova, ma questo è solo uno stile. I caratteri letterali sono probabilmente una delle strutture sintattiche meno conosciute di Ruby, e possono essere molto confusi quando non si sa cosa sia (specialmente se associato ad altri '?' S). –

+0

Significa la stessa cosa. Quindi corrisponderebbe [0] ==?,? partita: "qualche corda" – Bijan

Problemi correlati