¿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 %>
¿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 %>
Respuestas:
Es el operador ternario , y funciona como en C (no se requieren paréntesis). Es una expresión que funciona así:
if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this
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:
puts (if 1 then 2 else 3 end) # => 2
puts 1 ? 2 : 3 # => 2
x = if 1 then 2 else 3 end
puts x # => 2
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:
question = if question.size > 20 then
question.slice(0, 20) + "..."
else
question
end
nil
y false
. No muy habitual, de hecho.
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
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"
esperaba puts
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:
<% question = truncate(question, :length=>30) %>
@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:
(true) ? 1 : 0
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:
(true) \
? 1 \
: 0
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:
(true) ?
1 :
0
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.
¿Por qué has puesto corchetes
true
?
Considere el ejemplo del OP:
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
Ajustar la prueba condicional ayuda a que sea más legible porque separa visualmente la prueba:
<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %>
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:
<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \
: question.question
%>
O, más escrito más idiomáticamente:
<% question = if (question.size > 20)
question.question.slice(0, 20) + "..."
else
question.question
end
%>
Sería fácil argumentar que la legibilidad también sufre question.question
mucho.
true
?
true
realidad está sentado en lo que sería una expresión que se evalúa como true
o false
. 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
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
Y encontré una publicación sobre el tema que parece bastante útil.
enemy_id = player_id == 1 ? 2 : 1
?
El código condition ? statement_A : statement_B
es equivalente a
if condition == true
statement_A
else
statement_B
end
La manera más fácil:
param_a = 1
param_b = 2
result = param_a === param_b ? 'Same!' : 'Not same!'
ya param_a
que no es igual a param_b
entonces el result
valor de s seráNot same!
question=question[0,20]
Si fuera menor que 20, no lo cambiará.