Есть ли лучший способ проверить Nil или Length == 0 строки в Ruby?

есть ли лучший способ, чем следующий, проверить, является ли строка нулевой или имеет длину 0 в Ruby?

if !my_string || my_string.length == 0
  return true
else
  return false
end

В C# есть удобный

string.IsNullOrEmpty(myString)

что-нибудь похожее на это в Ruby?

15 ответов


когда я не беспокоюсь о производительности, я часто использую этот:

if my_string.to_s.empty?
  # It's nil or empty
end

Если вы готовы потребовать ActiveSupport вы можете просто использовать #blank? метод, который определен как для NilClass, так и для String.


мне нравится делать это следующим образом (в среде без Rails/ActiveSupport):

variable.to_s.empty?

это работает, потому что:

nil.to_s == ""
"".to_s == ""

альтернативой предложению jcoby будет:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

Как было сказано здесь перед Rails (ActiveSupport) есть удобный пустой? метод и он реализуется следующим образом:

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

довольно легко добавить в любой проект на основе ruby.

красота этого решения заключается в том, что оно работает автоматически не только для строк, но и для массивов и других типов.


переменной.пустой? будут делать это. Она возвращает true, если строка пуста или если строка равна нулю.


nil? можно опустить в логических контекстах. Как правило, вы можете использовать это для репликации кода C#:

return my_string.nil? || my_string.empty?

прежде всего, остерегайтесь этого метода:

As Джесси Эзель говорит:

Брэд Абрамс


каждый класс имеет nil? способ:

if a_variable.nil?
    # the variable has a nil value
end

и строк empty? способ:

if a_string.empty?
    # the string is empty
}

помните, что строка не равной nil когда он пуст, поэтому используйте empty? метод для проверки, если строка пуста.


Конрад Рудольф имеет правильный ответ.

Если это действительно вас беспокоит, исправьте класс строки или добавьте его в класс/модуль по вашему выбору. Это действительно не очень хорошая практика, чтобы обезьяна патч основных объектов, если у вас нет действительно веской причины, хотя.

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

затем вы можете сделать String.nilorempty? mystring


Проверьте пустые строки в обычном Ruby, избегая исключений NameError

здесь есть несколько хороших ответов, но вам не нужно ActiveSupport или monkey-patching для решения общего случая использования здесь. Например:

my_string.to_s.empty? if defined? my_string

это "делать правильные вещи", если my_string равен нулю или пустой строке, но не будет поднимать исключение NameError если my_string не определен. Это, как правило, предпочтительнее, чем больше придумано:

my_string.to_s.empty? rescue NameError

или его более подробный Ил, потому что исключения действительно должны быть сохранены для вещей, которые вы не ожидать. В этом случае, хотя это может быть распространенная ошибка, неопределенная переменная на самом деле не является исключительным обстоятельством, поэтому ее следует обрабатывать соответствующим образом.

ваш пробег может варьироваться.


другой вариант-преобразовать nil в пустой результат на лету:

(my_string||'').empty?


вы пробовали изыски?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?

для игроков в гольф кода (требуется ruby 2.3 или более поздней версии):

if my_string&.> ""
  p 'non-empty string'
else
  p 'nil or empty string'
end

в rails вы можете попробовать #blank?.

предупреждение: это даст вам положительные результаты, когда строка состоит из пробелов:

nil.blank? # ==> true
''.blank? # ==> true
'  '.blank? # ==> true
'false'.blank? # ==> false

просто хотел указать на это. Может быть, это соответствует вашим потребностям

UPD. почему я получаю старые вопросы в моей ленте? Извините за некропостинг.