2010-09-30 14 views
142
<%if @item.rigged %>Yes<%else%>No<%end%> 

Estaba pensando en algo como esto?Una línea si la declaración no funciona

if @item.rigged ? "Yes" : "No" 

Pero no funciona. Ruby tiene la ||= pero "no estoy siquiera seguro de cómo utilizar esa cosa.

Respuesta

317

Retire if de if @item.rigged ? "Yes" : "No"

operador ternario tiene forma condition ? if_true : if_false

+7

He vuelto a esta respuesta innumerables veces para la sintaxis ... ¡gracias! –

+0

Si la condición finaliza en un '?' ¿es posible soltarlo? 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' –

+0

@JayKilleen Estás en lo correcto. Ruby tiene que ver con trucos ingeniosos, pero es así de inteligente (: –

148

En Ruby, la condición y la parte then de un if La expresión debe estar separada por un separador de expresiones (es decir, ; o una línea nueva) o la palabra clave then.

Entonces, todo esto funcionaría:

if @item.rigged then 'Yes' else 'No' end 

if @item.rigged; 'Yes' else 'No' end 

if @item.rigged 
    'Yes' else 'No' end 

También hay un operador condicional en Ruby, pero eso es completamente innecesario. El operador condicional se necesita 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, necesita usar algo que puede devolver un valor. Y las únicas cosas en C que pueden devolver un valor son funciones y operadores, y dado que es imposible hacer que if sea 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 es necesario que el operador condicional incluso exista, y mucho menos utilícelo.

Por cierto: se acostumbra a métodos de nombres que se utilizan para hacer una pregunta con un signo de interrogación al final, de esta manera:

@item.rigged? 

Esto muestra otro problema con el uso del operador condicional en Ruby:

@item.rigged? ? 'Yes' : 'No' 

Es simplemente difícil de leer con los múltiples signos de interrogación que se cierran entre sí.

+2

+1 para la explicación'; '. –

+4

gracias. Esto debe elegirse como la mejor respuesta – MostafaMV

48

una línea si:

<statement> if <condition> 

su caso:

"Yes" if @item.rigged 

"No" if [email protected] # or: "No" unless @item.rigged 
+10

o '" No "a menos que @ item.rigged' para evitar el'! ' – Veger

6

Tanto la cáscara y C de una línea construye trabajo (rubí 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" 
1

Puede usar ----

(@item.rigged)? "Sí": "No"

If @item.aparejado es cierto, volverá 'Sí' de lo contrario se volverá 'No'

4

si el estado lo demás se puede cubrir con el operador ternario

@item.rigged? ? 'Yes' : 'No' 
8

Por lo que sé

3 de una sola línea

  1. a = 10 if <condition>

ejemplo: a = 10 if true # a = 10, b = 10 if false # b = nil

  1. a = 10 unless <condition>

ejemplo: a = 10 unless false # a = 10, b = 10 unless true # b = nil

  1. a = <condition> ? <a> : <b>

ejemplo: a = true ? 10 : 100 # a = 10, a = false ? 10 : 100 # a = 100

Espero que ayude.

Cuestiones relacionadas