Есть ли лучший способ проверить ноль или длину == 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

2
Использование вариаций stripможет быть весьма неэффективным.
Марк-Андре Лафортун

10
еще один интересный способ это my_string.to_s.empty?
Рикардо Пессоа

Для большинства людей первый вариант будет полностью приемлемым и хорошо читается.
Amrcus

68

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


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

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?


2

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

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

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

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


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?

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. почему я получаю старые вопросы в своем фиде? Извините за некропостинг.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.