unless - conditional ruby
¿Cómo uso el operador condicional(?:) en Ruby? (7)
¿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 %>
¡Una pequeña variación de esto es usar el converso a booleano! operador como este
result = !!(condition == true)
¿La condition ? statement_A : statement_B
código condition ? statement_A : statement_B
condition ? statement_A : statement_B
es equivalente a
if condition == true
statement_A
else
statement_B
end
@pst dio una gran respuesta, pero me gustaría mencionar que en Ruby el operador ternario está escrito en una línea para que sea 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 intentas dividirlo en varias líneas, pero puedes usar el símbolo /
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 distribuido.
También es posible usar el ternario sin los caracteres de continuación de línea poniendo a los operadores al último 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 aparentemente desconocida variación "flip-flop"). Son poderosos cuando se usan correctamente, por lo que debemos aprender a usarlos correctamente.
¿Por qué has puesto corchetes alrededor de
true
?
Considere el ejemplo de la OP:
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
Envolver 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 utilizando algunas adiciones juiciosas de espacios en blanco. Esto no está 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 sufre mucho de la question.question
también.
Es el operador ternario , y funciona como en C (no se requiere el paréntesis). Es una expresión que funciona como:
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, entonces: if a then b else c end
=== a ? b : c
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 está en puts if 1
con algo de basura adicional), pero no se requieren en el último caso ya que dicho problema no surge.
Puede utilizar 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
Su uso de ERB sugiere que usted está en Rails. Si es así, entonces considere truncate
, un ayudante incorporado que hará el trabajo por usted:
<% question = truncate(question, :length=>30) %>
Un ejemplo simple en el que el operador comprueba si la identificación del jugador es 1 y establece la identificación del enemigo según el resultado
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
Y encontré una post sobre el tema que parece bastante útil.
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"