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

169

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

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

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

string.IsNullOrEmpty(myString)

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

Джим Фиорато
источник
16
Излишне иметь выражение if вроде этого: «if (условие) тогда true, иначе false». Само условие имеет ту же правдивость, что и выражение if.
KaptajnKold
my_string || my_string.length == 0поднимет, NoMethodErrorесли my_stringноль. Я думаю, что вы имели в виду:my_string.nil? || my_string.length == 0
Naveed
1
Должно ли это быть!my_string || my_string.length == 0
Левса

Ответы:

224

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

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

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

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end
Ezran
источник
2
Использование вариаций stripможет быть весьма неэффективным.
Марк-Андре Лафортун
10
еще один интересный способ это my_string.to_s.empty?
Рикардо Пессоа
Для большинства людей первый вариант будет полностью приемлемым и хорошо читается.
Amrcus
68

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

AVDI
источник
15
Обратите внимание, что строка, содержащая только пробел, по-прежнему считается пустой. Так что "" .blank? правда.
Грант Хатчинс
2
Кроме того, логическое false, {} и [] считаются пустыми. Т.е. {} .blank ?, [] .blank ?, false.blank? все оценивают как верные.
ShaharZ
64

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

variable.to_s.empty?

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

nil.to_s == ""
"".to_s == ""
Виная Сахни
источник
3
Хорошее объяснение, почему string.to_s.empty?работает как для, так nilи для "".
Георгий
31

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

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
Ромуло Цеккон
источник
10
Но .. но .. Библиотека ядра ruby ​​уже реализует это. nil.to_s => "", так что вы можете сказать thing.to_s == ""
DigitalRoss
1
@DigitalRoss Это позволяет избежать преобразования строк, что может быть или не быть незначительной проблемой производительности.
Вортико
30

Как было сказано здесь до того, как у Rails (ActiveSupport) есть удобный бланк? метод, и это реализовано так:

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

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

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

Хонза
источник
15

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

Сатья Каллури
источник
12
На самом деле, это только рельсовое расширение, а не чистый рубин. Но если вы используете рельсы, это очень удобно!
Джеймс П МакГрат
13

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

return my_string.nil? || my_string.empty?
Конрад Рудольф
источник
7

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

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

Брэд Абрамс

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

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

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

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

class NilClass
    def empty?; true; end
end
VonC
источник
5

У каждого класса есть nil?метод:

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

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

if a_string.empty?
    # the string is empty
}

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

Джереми Рутен
источник
4

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

(my_string||'').empty?

mahemoff
источник
2

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

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

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

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

jcoby
источник
2

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

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

my_string.to_s.empty? if defined? my_string

Это «сделает правильно», если my_string равно nil или пустой строке, но не вызовет исключение NameError, если my_string не определено. Это обычно предпочтительнее, чем более надуманным:

my_string.to_s.empty? rescue NameError

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

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

Тодд А. Джейкобс
источник
1

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

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?
RichOrElse
источник
1

Если вы используете рельсы, вы можете использовать #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

Итак, наоборот, чтобы проверить для использования нулевой или нулевой длины !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true
Дивья Дандапани
источник
0

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

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

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

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

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

Nondv
источник
0

Для игроков в гольф код:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

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

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
snipsnipsnip
источник