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

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

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

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

string.IsNullOrEmpty(myString)

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

Ответ 1

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

if my_string.to_s == ''
  # It nil or empty
end

Конечно, есть разные варианты...

if my_string.to_s.strip.length == 0
  # It nil, empty, or just whitespace
end

Ответ 2

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

Ответ 3

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

variable.to_s.empty?

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

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

Ответ 4

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

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

Ответ 5

Как уже было сказано выше, у Rails (ActiveSupport) есть удобный blank?, и он реализован следующим образом:

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

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

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

Ответ 6

variable.blank? сделаю это. Он возвращает true, если строка пуста или строка равна nil.

Ответ 7

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

return my_string.nil? || my_string.empty?

Ответ 8

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

Как Джесси Эзел говорит:

Брэд Абрамс

"Метод может показаться удобным, но большую часть времени я обнаружил, что эта ситуация возникает из-за попыток скрыть более глубокие ошибки.

Ваш код должен придерживаться определенного протокола об использовании строк, и вы должны понимать использование протокола в коде библиотеки и в коде, с которым работаете.

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

И если вы меняете класс String... убедитесь, что NilClass не был патчем либо!

class NilClass
    def empty?; true; end
end

Ответ 9

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

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

И строки имеют метод empty?:

if a_string.empty?
    # the string is empty
}

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

Ответ 10

Другой вариант - конвертировать ноль в пустой результат на лету:

(my_string||'').empty?

Ответ 11

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

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

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

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

Ответ 12

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

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

my_string.to_s.empty? if defined? my_string

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

my_string.to_s.empty? rescue NameError

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

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

Ответ 13

Вы пробовали уточнения?

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?

Ответ 14

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

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

Ответ 15

В рельсах вы можете попробовать #blank?.

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

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

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

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