Дублирование .blank? в стандартном рубине - PullRequest
6 голосов
/ 05 мая 2011

У Rails есть .blank?метод, который будет возвращать true, если объект пуст?или ноль?Фактический код для этого можно найти здесь .Когда я пытаюсь на 1.9.2 дублировать это, выполнив:

class Object

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

end

Вызов "" .blank?возвращает true, но вызывает "" .blank?возвращает false, когда согласно документации rails строка пробелов должна иметь значение true для .blank?Прежде чем я посмотрел код, я изначально написал:

class Object

  def blank?
    !!self.empty? || !!self.nil?
  end

end

и получил те же результаты.Чего мне не хватает?

Ответы [ 3 ]

13 голосов
/ 05 мая 2011

Вы забыли об этом - https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb#L95

class String
  # A string is blank if it's empty or contains whitespaces only:
  #
  #   "".blank?                 # => true
  #   "   ".blank?              # => true
  #   " something here ".blank? # => false
  #
  def blank?
    self !~ /\S/
  end
end
2 голосов
/ 05 мая 2011

Класс String переопределяет реализацию Object blank? в реализации Rails:

class String

  def blank?
    # Blank if this String is not composed of characters other than whitespace.
    self !~ /\S/ 
  end

end
1 голос
/ 05 мая 2011

Строки не классифицируются как empty?, если они заполнены только пробелами

>> "  ".empty?
=> false

Поэтому вы можете также создать

class String
  def blank?
    strip.empty?
  end
end

Но подумайте об этом -Подобные патчи опасны, особенно если другие модули будут использовать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...