2013-05-02 11 views
6

String#blank? è molto utile, ma esiste in Rails, non in Ruby.C'è una stringa di Ruby # vuota? metodo?

C'è qualcosa di simile in Ruby, in sostituzione:

str.nil? || str.empty? 
+0

Non vedo nulla di simile nel riferimento http://ruby-doc.org/core-2.0/String.html – shishirmk

+0

Vedere questa risposta per alcune informazioni: http://stackoverflow.com/questions/4819899/rails -objectblank-vs-stringempty-confusion – squiguy

+1

Possibile duplicato: http://stackoverflow.com/questions/247948/is-there-a-better-way-of-checking-nil-or-length-0-of-a- string-in-ruby – christianblais

risposta

10

Afai K non c'è nulla di simile in chiaro Ruby. È possibile creare il proprio in questo modo:

class NilClass 
    def blank? 
    true 
    end 
end 

class String 
    def blank? 
    self.strip.empty? 
    end 
end 

questo lavoro per nil.blank? e a_string.blank? è possibile estendere questo (come rotaie fa) per gli oggetti vero/falso e generali:

class FalseClass 
    def blank? 
    true 
    end 
end 

class TrueClass 
    def blank? 
    false 
    end 
end 

class Object 
    def blank? 
    respond_to?(:empty?) ? empty? : !self 
    end 
end 

Riferimenti:

https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L57 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L67 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L14 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L47

E qui è la String.blank? attuazione, che dovrebbe essere più efficiente di quella precedente:

https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L101

+0

Tale implementazione potrebbe essere resa più inefficiente. Provalo su "una stringa molto molto lunga ......" "solo per divertimento! –

+0

È una pratica scarsa estendere NilClass? –

+0

@BSeven Sì, e questa soluzione non funziona sulla varietà di oggetti utilizzata dal metodo Rails. Inoltre, come sottolineato da Marc-Andre, 'strip' è un po 'inefficiente (specialmente quando si butta via l'output) –

1

Supponendo che la stringa può essere messo a nudo, cosa c'è di sbagliato con come nell'esempio seguente:

2.0.0p0 :004 > ' '.nil? or ' '.strip.empty? 
=> true 
+1

Questo non è sufficiente poiché, ad esempio, nil.blank? dovrebbe restituire true – aromero

+1

Perché non solo 'strip'? – squiguy

+2

perché non sapevo di strip. – hd1

3

Si può sempre fare esattamente quello che fa Rails. Se si guarda a the source to blank, si vede si aggiunge il seguente metodo per Object:

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 14 
    def blank? 
    respond_to?(:empty?) ? empty? : !self 
    end 
+1

Vale la pena ricordare che il codice è stato adattato a 'respond_to? (: Vuoto?)? !!vuoto? :! self? nelle versioni più recenti. –

2

No tale funzione esiste in Ruby, ma c'è una proposta attivo per String#blank? su ruby-core.

Nel frattempo, è possibile utilizzare questa implementazione:

class String 
    def blank? 
    !include?(/[^[:space:]]/) 
    end 
end 

Questa implementazione sarà molto efficace, anche per stringhe molto lunghe.

Problemi correlati