Si su condición termina en un '?' ¿es posible dejarlo caer? Es decir, si la condición es @ customer.sales.present? ¿Puedes soltar el '?' ... no te preocupes. Encontré un código que tenía y lo probé. La respuesta es 'no'
Jay Killeen
@ JayKilleen Estás en lo correcto. Ruby es todo acerca de trucos inteligentes, pero es que inteligente (:
Nikita Rybak
1
@NikitaRybak s/that/not that :)
Austin
180
En Ruby, la condición y la thenparte de una ifexpresión deben estar separadas por un separador de expresión (es decir, ;o una nueva línea) o la thenpalabra clave.
También hay un operador condicional en Ruby, pero eso es completamente innecesario. El operador condicional es necesario en C, porque es un operador: en C, ifes una declaración y, por lo tanto, no puede devolver un valor, por lo que si desea devolver un valor, debe usar algo que pueda devolver un valor. Y las únicas cosas en C que pueden devolver un valor son funciones y operadores, y dado que es imposible hacer ifuna función en C, necesita un operador.
En Ruby, sin embargo, ifes una expresión. De hecho, todo es una expresión en Ruby, por lo que ya puede devolver un valor. No hay ninguna necesidad de que el operador condicional para siquiera existen , y mucho menos usarlo.
Por cierto: es costumbre nombrar los métodos que se utilizan para hacer una pregunta con un signo de interrogación al final, como este:
@item.rigged?
Esto muestra otro problema con el uso del operador condicional en Ruby:
@item.rigged??'Yes':'No'
Simplemente es difícil de leer con los múltiples signos de interrogación que están cerca uno del otro.
Esta solución es diferente en el sentido de que devuelve en nillugar de 'Yes'si item.riggedes verdadero. Línea simple si o a menos que las declaraciones regresen nilsi no se cumple la condición.
Perro Esta es la mejor respuesta: me encanta cuán sucintamente contrasta las tres formas. ¡Gracias!
MrVocabulary
7
Tanto las construcciones de shell y C de una línea funcionan (ruby 1.9.3p429):
# Shell format
irb(main):022:0>true&&"Yes"||"No"=>"Yes"
irb(main):023:0>false&&"Yes"||"No"=>"No"# C format
irb(main):024:0>true?"Yes":"No"=>"Yes"
irb(main):025:0>false?"Yes":"No"=>"No"
Respuestas:
Eliminar
if
deif @item.rigged ? "Yes" : "No"
El operador ternario tiene forma
condition ? if_true : if_false
fuente
s/that/not that
:)En Ruby, la condición y la
then
parte de unaif
expresión deben estar separadas por un separador de expresión (es decir,;
o una nueva línea) o lathen
palabra clave.Entonces, todo esto funcionaría:
También hay un operador condicional en Ruby, pero eso es completamente innecesario. El operador condicional es necesario en C, porque es un operador: en C,
if
es una declaración y, por lo tanto, no puede devolver un valor, por lo que si desea devolver un valor, debe usar algo que pueda devolver un valor. Y las únicas cosas en C que pueden devolver un valor son funciones y operadores, y dado que es imposible hacerif
una función en C, necesita un operador.En Ruby, sin embargo,
if
es una expresión. De hecho, todo es una expresión en Ruby, por lo que ya puede devolver un valor. No hay ninguna necesidad de que el operador condicional para siquiera existen , y mucho menos usarlo.Por cierto: es costumbre nombrar los métodos que se utilizan para hacer una pregunta con un signo de interrogación al final, como este:
Esto muestra otro problema con el uso del operador condicional en Ruby:
Simplemente es difícil de leer con los múltiples signos de interrogación que están cerca uno del otro.
fuente
Una línea si:
Tu caso:
fuente
"No" unless @item.rigged
para evitar el!
nil
lugar de'Yes'
siitem.rigged
es verdadero. Línea simple si o a menos que las declaraciones regresennil
si no se cumple la condición.Por lo que sé
3 líneas simples
a = 10 if <condition>
ejemplo:
a = 10 unless <condition>
ejemplo:
a = <condition> ? <a> : <b>
ejemplo:
Espero que ayude.
fuente
Tanto las construcciones de shell y C de una línea funcionan (ruby 1.9.3p429):
fuente
de lo contrario, la condición se puede cubrir con un operador ternario
fuente
Para simplificar, si necesita establecer un valor predeterminado si es nulo, puede usar:
fuente
Puedes usar ----
(@ item.rigged)? "Sí No"
Si @ item.rigged es verdadero, devolverá 'Sí'; de lo contrario, devolverá 'No'
fuente