2013-05-02 2 views
6

String#blank? очень полезен, но существует в Rails, а не Ruby.Есть ли строка Ruby # blank? метод?

Есть ли что-то подобное в Ruby, чтобы заменить:

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

Я не вижу ничего подобного в ссылке http://ruby-doc.org/core-2.0/String.html – shishirmk

+0

См. Этот ответ для получения некоторой информации: http://stackoverflow.com/questions/4819899/rails -objectblank-vs-stringempty-confusion – squiguy

+1

Возможный дубликат: http://stackoverflow.com/questions/247948/is-there-a-better-way-of-checking-nil-or-length-0-of-a- string-in-ruby – christianblais

ответ

10

AfaI K нет ничего подобного в простом Ruby. Вы можете создать свой собственный, как это:

class NilClass 
    def blank? 
    true 
    end 
end 

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

Это будет работать для nil.blank? и a_string.blank? вы можете расширить это (как рельсам делает) для истинных/ложных и общих объектов:

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 

Ссылки:

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

А вот String.blank? реализация которых должна быть более эффективной, чем предыдущая:

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

+0

Эта реализация может быть более неэффективной. Попробуйте «очень длинную строку ...» просто для удовольствия! –

+0

Неудобно ли распространять NilClass? –

+0

@BSEven Да, и это решение не работает с множеством объектов, которые делает метод Rails. Кроме того, как отметил Марк-Андре, «полоса» немного неэффективна (особенно когда вы выбрасываете выход) –

1

Если предположить, что строка может быть зачищены, что случилось с как в следующем примере:

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

Этого недостаточно, так как, например, nil.blank? должен возвращать true – aromero

+1

Почему бы не просто 'strip'? – squiguy

+2

Потому что я не знал о полосе. – hd1

3

Вы всегда можете сделать именно то, что делает Rails. Если вы посмотрите на the source to blank, вы видите, это добавляет следующий метод Object:

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

Возможно, стоит упомянуть, что код был скорректирован на 'response_to? (: Empty?)? !! пусто? :! self' в новых версиях. –

2

Нет такой функции не существует в Ruby, но есть активное предложение для String#blank? на ruby-core.

В то же время, вы можете использовать эту реализацию:

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

Эта реализация будет очень эффективным, даже для очень длинных строк.

Смежные вопросы