Ответ 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
Есть ли лучший способ, чем следующий, чтобы проверить, является ли строка нулевой ИЛИ имеет длину 0 в Ruby?
if !my_string || my_string.length == 0
return true
else
return false
end
В С# есть удобный
string.IsNullOrEmpty(myString)
Что-нибудь похожее на это в Ruby?
Когда я не беспокоюсь о производительности, я часто использую это:
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
Если вы хотите использовать 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) есть удобный blank?, и он реализован следующим образом:
class Object
def blank?
respond_to?(:empty?) ? empty? : !self
end
end
Довольно легко добавить в любой проект на основе Ruby.
Красота этого решения заключается в том, что он работает автоматически и не только для строк, но и для массивов и других типов.
variable.blank? сделаю это. Он возвращает true, если строка пуста или строка равна nil.
nil?
может быть опущен в булевых контекстах. Как правило, вы можете использовать это для репликации кода С#:
return my_string.nil? || my_string.empty?
Прежде всего, остерегайтесь этого метода:
Как Джесси Эзел говорит:
"Метод может показаться удобным, но большую часть времени я обнаружил, что эта ситуация возникает из-за попыток скрыть более глубокие ошибки.
Ваш код должен придерживаться определенного протокола об использовании строк, и вы должны понимать использование протокола в коде библиотеки и в коде, с которым работаете.
Протокол NullOrEmpty, как правило, является быстрым решением (поэтому реальная проблема все еще находится где-то в другом месте, и вы используете два протокола), или это отсутствие опыта в конкретном протоколе при внедрении нового кода (и, опять же, вы должны действительно знаю, каковы ваши возвращаемые значения).
И если вы меняете класс String... убедитесь, что NilClass не был патчем либо!
class NilClass
def empty?; true; end
end
Каждый класс имеет метод nil?
:
if a_variable.nil?
# the variable has a nil value
end
И строки имеют метод empty?
:
if a_string.empty?
# the string is empty
}
Помните, что строка не равна nil
, когда она пуста, поэтому используйте метод empty?
, чтобы проверить, является ли строка пустой.
Другой вариант - конвертировать ноль в пустой результат на лету:
(my_string||'').empty?
Конрад Рудольф имеет правильный ответ.
Если это действительно вас задевает, обезьяна заплатит класс String или добавит его в класс/модуль по вашему выбору. Это действительно нехорошая практика для объектов ядра обезьяны, если у вас нет действительно убедительной причины.
class String
def self.nilorempty?(string)
string.nil? || string.empty?
end
end
Затем вы можете сделать String.nilorempty? mystring
Здесь есть несколько хороших ответов, но вам не нужны 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 не является исключительным обстоятельством, поэтому ее следует обрабатывать соответствующим образом.
Ваш пробег может отличаться.
Вы пробовали уточнения?
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
В рельсах вы можете попробовать #blank?
.
Предупреждение: это даст вам положительные результаты, когда строка состоит из пробелов:
nil.blank? # ==> true
''.blank? # ==> true
' '.blank? # ==> true
'false'.blank? # ==> false
Просто хотел указать на это. Может быть, это соответствует вашим потребностям
UPD. почему я получаю старые вопросы в своей ленте? Извините за некропостинг.