2012-05-06 10 views
6

Sono abbastanza nuovo per Ruby e Rails ma anche dopo aver cercato lo stack overflow e google non sono riuscito a trovare una risposta a questo.Espressione ternaria con "definito?" restituisce "espressione" invece di valore?

Ho una semplice scorciatoia rubino if che dovrebbe restituire un integer in questo modo:

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

r() è una funzione di supporto personalizzato che restituisce un numero casuale compreso tra in questo caso 1 e 4.

il modo intendo questo lavoro è che ifamount è definito, quindi utilizzare il numero definito come amount, else generare un numero casuale compreso tra 1 e 4 e utilizzarlo.

Quando si stampa @c tuttavia Ruby emette expression anziché un numero.

Cosa devo fare per far funzionare tutto ciò che intendo e cosa sto facendo male?

Mille grazie per aver letto!

risposta

8

defined? è vincolante per amount ? amount : r(1,4) quindi è equivalente a:

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

Probabilmente si desidera:

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

In realtà, le probabilità sono che amount || r(1,4), o amount.nil? ? r(1,4) : amount sarebbe meglio corrispondere a ciò che si vuole, dal momento che Penso che tu non voglia questo:

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

... nel qual caso @c sarebbe nil - il valore della variabile definita.

+0

Perfetto, grazie mille! Ovviamente devo ancora imparare un po 'di queste nozioni di base, ma questo è stato molto utile 'importo || r (x, y) 'funziona esattamente come volevo ed è tutto in meno caratteri allo stesso tempo. – Jannis

2

utilizzare l'operatore || in questo caso:

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

Nel codice, il metodo defined? opera su amount ? amount : r(1,4) invece di su amount come desiderato. Inoltre, l'operatore defined? probabilmente non fa quello che ti aspetti, dai un'occhiata a questo blog entry per avere un'idea.

+0

Grazie! Quel post sul blog è stato molto illuminante, ora vedo che cosa 'definito?' È veramente utile! – Jannis