2012-05-06 13 views
6

Soy bastante nuevo para Ruby and Rails, pero incluso después de buscar el desbordamiento de pila y google no pude encontrar una respuesta a esto.Expresión ternaria con "definido?" devuelve "expresión" en lugar de valor?

Tengo un simple abreviatura Rubí si la declaración que debe devolver un integer así:

# in the context of this erb document `amount` is defined as 5. 
@c = (defined? amount ? amount : r(1,4)) 

r() es una función de ayuda personalizado que devuelve un número aleatorio entre en este caso 1 y 4.

la forma en que la intención que esto funcione es que se define ifamount, a continuación, utilizar el número definido como amount, else generar un número aleatorio entre 1 y 4 y el uso que en lugar.

Al imprimir @c, sin embargo, las salidas de Ruby expression en lugar de un número.

¿Qué tengo que hacer para que esto funcione como me propuse y qué estoy haciendo mal?

Muchas gracias por leerlo!

Respuesta

8

defined? es vinculante para amount ? amount : r(1,4) por lo que es equivalente a:

defined?(amount ? amount : r(1,4)) 

Es probable que desee:

defined?(amount) ? amount : r(1,4) 

En realidad, las probabilidades son que amount || r(1,4), o amount.nil? ? r(1,4) : amount sería mejor concuerde con lo que desee, ya Creo que no quiere esto:

 
1.9.3p194 :001 > defined?(amount) 
=> nil 
1.9.3p194 :002 > amount = nil 
=> nil 
1.9.3p194 :003 > defined?(amount) 
=> "local-variable" 

... en cuyo caso @c sería nil - el valor de la variable definida.

+0

Perfecto, muchas gracias! Obviamente todavía tengo que aprender más sobre estos conceptos básicos, pero esta ha sido una gran ayuda 'cantidad || r (x, y) 'funciona exactamente como yo quería y está todo en menos caracteres al mismo tiempo. – Jannis

2

utilizar el operador || en este caso:

@c = amount || r (1,4) 

En su código, el método funciona en defined?amount ? amount : r(1,4) en lugar de sólo en amount como se pretendía. Además, el operador defined? probablemente no haga lo que espera, eche un vistazo a este blog entry para tener una idea.

+0

¡Gracias! Esa publicación del blog fue muy esclarecedora, ahora veo lo que 'define?' Es realmente útil. – Jannis

Cuestiones relacionadas