2010-03-25 20 views
16

Quindi so in rubino che x.nil? testerà se x è nullo.modo più semplice per verificare solo gli spazi in rubino

Qual è il modo più semplice per verificare se x è uguale a "" o "(due spazi) o" (tre spazi), ecc.?

Fondamentalmente, mi chiedo quale sia il modo migliore per verificare se una variabile è tutto spazio bianco?

+0

lasciatemi in realtà chiarire la mia domanda perché non era del tutto chiaro ... im in realtà l'esecuzione di questo nel contesto di un'istruzione if. quindi sto controllando x.nil? e voglio anche x. (ci sono solo spazi bianchi, quindi lo considero nullo) per entrambi essere valutato condizionatamente – user301752

+0

@ user301752 quando dici 'nil' vuoi dire una stringa vuota? Non sono la stessa cosa in Ruby. (Apri una sessione 'irb' e verifica:' x = ''; x.nil? '.) – Telemachus

+0

perché non tagliare prima? –

risposta

15
s =~ /^\s*$/ 

soluzione Regex. Ecco uno short ruby regex tutorial.

+0

grazie! ho appena iniziato ad imparare il ruby ​​e non mi sono reso conto che = ~ valuterei condizionalmente l'espressione regolare che è piuttosto dolce. – user301752

+0

@Stefan Penso che tu voglia '/^\ s + $ /' dato che '*' corrisponderà troppo (es. ottieni una corrispondenza per una stringa vuota - niente spazi). – Telemachus

+0

Ho considerato "tutti gli spazi bianchi". Questo potrebbe essere o non essere corretto nel dominio del problema, ma non pensavo che la domanda fosse formulata in modo tale da rendere o * o + errato. –

0
a = " " 

a.each_byte do |x| 
    if x == 32 
    puts "space" 
    end 
end 
+2

Per il downvoter, sarebbe bene sapere cosa c'è di sbagliato nella risposta (o in che modo non è utile) – OscarRyz

+2

Non ero il downvoter, ma questa non è la soluzione più semplice, né stiamo controllando che il 32 raggiunga tutti gli spazi. – miorel

+0

La domanda era ambigua se voleva spazi o tutti i caratteri di spazi bianchi (inclusi tabulazioni, newline, ecc.). – Chuck

5

Se x è tutti gli spazi vuoti, quindi x.strip sarà la stringa vuota. Così si può fare:

if not x.nil? and x.strip.empty? then 
    puts "It's all whitespace!" 
end 

In alternativa, utilizzando un'espressione regolare, x =~ /\S/ tornerà falso se e solo se è x tutti i caratteri di spazi bianchi:

if not (x.nil? or x =~ /\S/) then 
    puts "It's all whitespace!" 
end 
+0

Perché il downvote ?! –

+0

Non ho fatto downvot. – miorel

+0

Mladen si riferiva a un downvot che era sulla tua risposta, non ti accusava di downvoting degli altri. – Beanish

0

Sulla base della sua commento Penso che si può estendere la classe String e definire un metodo spaces? come segue:

$ irb 
>> s = " " 
=> " " 
>> s.spaces? 
NoMethodError: undefined method `spaces?' for " ":String 
    from (irb):2 
>> class String 
>>  def spaces? 
>>   x = self =~ /^\s+$/ 
>>   x == 0 
>>  end 
>> end 
=> nil 
>> s.spaces? 
=> true 
>> s = "" 
=> "" 
>> s.spaces? 
=> false 
>> 
21

"migliore" dipende dal contesto, ma qui è un modo semplice.

some_string.strip.empty? 
26

Se si utilizza Rails, si può semplicemente utilizzare:

x.blank? 

Questo è sicuro chiamare quando x è pari a zero, e restituisce vero se x è nullo o tutti gli spazi.

Se non si utilizza Rails è possibile ottenerlo dalla gemma activesupport. Installa con gem install activesupport. Nel file require 'active_support/core_ext per ottenere tutte le estensioni di supporto attive alle classi di base o require 'active_support/core_ext/string' per ottenere solo le estensioni della classe String. In entrambi i casi, il metodo blank? sarà disponibile dopo la richiesta.

+4

Tra l'altro mi scuso con i Rubyists per trascinare Rails in quella che altrimenti sarebbe stata una bella discussione di Ruby. È solo un bel modello da emulare. – MikeJ

+0

@ david-miani È un peccato che non ci sia modo di fare +1 sulla modifica, perché è eccellente. È un brutto tipo di eccesso di ottimizzazione per strappare codice da ActiveSupport quando AS supporta già solo le funzionalità necessarie. – MikeJ

0

Ancora un altro :) string.all? { |c| c == ' ' }

Problemi correlati