¿Cómo se ? :
usa el operador condicional ( ) en Ruby?
Por ejemplo, ¿es esto correcto?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Mithun Sreedharan
fuente
fuente
question=question[0,20]
Si fuera menor que 20, no lo cambiará.Respuestas:
Es el operador ternario , y funciona como en C (no se requieren paréntesis). Es una expresión que funciona así:
Sin embargo, en Ruby,
if
también es una expresión así:if a then b else c end
===a ? b : c
, excepto por cuestiones de precedencia. Ambas son expresiones.Ejemplos:
Tenga en cuenta que en el primer caso se requieren paréntesis (de lo contrario, Ruby se confunde porque cree que es
puts if 1
con algo de basura adicional después de eso), pero no se requieren en el último caso ya que dicho problema no surge.Puede usar el formulario "long-if" para facilitar la lectura en varias líneas:
fuente
nil
yfalse
. No muy habitual, de hecho.fuente
puts (true ? "true" : "false")
con paréntesis. De lo contrario, el orden de las operaciones no está claro. Cuando leí esto por primera vez, estaba confundido cuando lo leí, ya que(puts true) ? "true" : "false"
esperabaputs
devolver el booleano que luego se convirtió en el valor de la cadena.Su uso de ERB sugiere que está en Rails. Si es así, considere
truncate
un ayudante incorporado que hará el trabajo por usted:fuente
@pst dio una gran respuesta, pero me gustaría mencionar que en Ruby el operador ternario está escrito en una línea para ser sintácticamente correcto, a diferencia de Perl y C, donde podemos escribirlo en varias líneas:
Normalmente, Ruby generará un error si intenta dividirlo en varias líneas, pero puede usar el
\
símbolo de continuación de línea al final de una línea y Ruby estará feliz:Este es un ejemplo simple, pero puede ser muy útil cuando se trata de líneas más largas, ya que mantiene el código bien diseñado.
También es posible usar el ternario sin los caracteres de continuación de línea poniendo los operadores en último lugar en la línea, pero no me gusta ni lo recomiendo:
Creo que eso lleva a un código realmente difícil de leer a medida que la prueba condicional y / o los resultados se alargan.
He leído comentarios que dicen no usar el operador ternario porque es confuso, pero esa es una mala razón para no usar algo. Por la misma lógica, no deberíamos usar expresiones regulares, operadores de rango ('
..
' y la variación aparentemente desconocida de "flip-flop"). Son potentes cuando se usan correctamente, por lo que debemos aprender a usarlos correctamente.Considere el ejemplo del OP:
Ajustar la prueba condicional ayuda a que sea más legible porque separa visualmente la prueba:
Por supuesto, todo el ejemplo podría hacerse mucho más legible mediante el uso de algunas adiciones juiciosas de espacios en blanco. Esto no se ha probado, pero obtendrá la idea:
O, más escrito más idiomáticamente:
Sería fácil argumentar que la legibilidad también sufre
question.question
mucho.fuente
true
?true
realidad está sentado en lo que sería una expresión que se evalúa comotrue
ofalse
. Es mejor delimitarlos visualmente, ya que las declaraciones ternarias pueden convertirse rápidamente en ruido visual, reduciendo la legibilidad que afecta la mantenibilidad.Un ejemplo simple donde el operador verifica si la identificación del jugador es 1 y establece la identificación del enemigo dependiendo del resultado
Y encontré una publicación sobre el tema que parece bastante útil.
fuente
enemy_id = player_id == 1 ? 2 : 1
?El código
condition ? statement_A : statement_B
es equivalente afuente
La manera más fácil:
ya
param_a
que no es igual aparam_b
entonces elresult
valor de s seráNot same!
fuente