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"
.
fonte
2012-03-15 02:09:05
Grazie a @AndrewMarshall, sarebbe stato utile se fosse 'match == (?,)? match: "some string" '? O vorrebbe dire qualcos'altro? – ismail
@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). –
Significa la stessa cosa. Quindi corrisponderebbe [0] ==?,? partita: "qualche corda" – Bijan