A (un poco) de manera menos confuso para escribir esto es:
str.split(/',\s*'/).map do |match|
if match[0] == ?,
match
else
"some string"
end
end.join
creo declaraciones ternarios de varias líneas son horribles, sobre todo porque if
bloques pueden volver en Ruby.
Probablemente lo más confuso aquí sea el ?,
que es un carácter literal. En Ruby 1.8 esto significa el valor ASCII del personaje (en este caso 44
), en Ruby 1.9 esto es solo una cadena (en este caso ","
).
La razón para usar un literal de caracteres en lugar de solo ","
es que el valor de retorno de llamar a []
en una cadena cambió en 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. Usar ?,
aquí evita tener que preocuparse por las diferencias en String#[]
entre Ruby 1.8 & 1.9.
En última instancia, el condicional solo está comprobando si el primer carácter en match
es , y si es así mantiene el valor igual, de lo contrario, lo establece en "some string"
.
Gracias @AndrewMarshall, hubiera sido útil si fuera 'match == (?,)? partido: "alguna cadena" '? ¿O eso significaría algo más? – ismail
@IsmailTabtabai Eso sería lo mismo. Cada vez que hago declaraciones ternarias, normalmente envuelvo todo el enunciado condicional entre paréntesis para dejar claro dónde está, pero eso es solo estilo. Los literales de caracteres son probablemente una de las estructuras sintácticas menos conocidas de Ruby, y pueden ser muy confusas cuando no se sabe qué es (especialmente cuando se combinan con otros '?' S). –
Significa lo mismo. Entonces, ¿coincidiría con [0] ==?,? partido: "alguna cadena" – Bijan