2012-03-15 13 views
6

me encontré con un ternario en algún código y estoy teniendo problemas para entender el condicional:¿Cómo lees esta condición ternaria en Ruby?

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

Yo entiendo que estoy dividiendo una cadena en ciertos puntos y convirtiendo el resultado global de una matriz, y hacer frente a cada elemento de la matriz a su vez. Más allá de eso, no tengo idea de lo que está pasando.

Respuesta

7

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".

+0

Gracias @AndrewMarshall, hubiera sido útil si fuera 'match == (?,)? partido: "alguna cadena" '? ¿O eso significaría algo más? – ismail

+0

@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). –

+0

Significa lo mismo. Entonces, ¿coincidiría con [0] ==?,? partido: "alguna cadena" – Bijan

Cuestiones relacionadas