2013-01-19 10 views
10

solito faccioRuby/Rails usando || per determinare il valore, utilizzando una stringa vuota invece di un valore nullo

value = input || "default" 

quindi se ingresso = nil

value = "default" 

Ma come posso fare questo modo, invece di nil Conta anche una stringa vuota '' come nil

voglio in modo che se faccio

input = '' 
value = input || "default" 
=> "default" 

C'è un modo semplice ed elegante per farlo senza if?

+0

Nota che hai taggato la tua domanda come "ruby-on-rails", quindi le risposte specifiche di Rails. –

+0

Sì, stavo correndo su rotaie quindi non è stato un problema, ho anche taggato Ruby perché sembrava più un problema rubino - ho modificato il titolo per abbinare le risposte/domanda migliore – Akshat

risposta

30

Rails aggiunge presence metodo a tutti objec t che fa esattamente quello che vuoi

input = '' 
value = input.presence || "default" 
=> "default" 

input = 'value' 
value = input.presence || "default" 
=> "value" 

input = nil 
value = input.presence || "default" 
=> "default" 
+1

Sì, ma è _RAILS_ONLY_, il rubino "puro" non ce l'ha. –

+0

Sì, è l'estensione di Rails, così come 'vuoto?' – dimuch

3

faccio di solito in questo modo:

value = input.blank? ? "default" : input 

In risposta al caso in cui ingresso non potrebbe essere definito, si può proteggila da:

value = input || (input.blank? ? "default" : input) 
# I just tried that the parentheses are required, or else its return is incorrect 

per Ruby puro (non dipende Rails), è possibile utilizzare empty?

value = input || (input.empty? ? "default" : input) 
value = (input ||= "").empty? ? "default" : input # thanks gg_s for providing this 
+0

che funziona alla grande! – Akshat

+0

Ho un'altra domanda: funziona benissimo se abbiamo un input effettivamente definito da qualche parte. Ma cosa succede se non lo facciamo? Quindi, tutto ciò che otteniamo è "variabile o metodo locale indefinito"? –

+0

@DmitriyUgnichenko ha aggiornato la risposta, vedi se risponde alla tua domanda :) – PeterWong

0

Forse irrelavant ma vorrei utilizzare Highline come questo:

require "highline/import" 

input = ask('Input: ') { |q| q.default = "default" } 

Funziona senza Rails. Soluzione davvero pulita.

Problemi correlati