Краткое объяснение nil v. пустой v. пробел в Ruby on Rails
Я постоянно ищу четкое определение различий nil?, blank? и empty? в Ruby on Rails. Вот ближе всего я подошел:
blank?объекты являются ложными, пустыми, или пробельные строки. Например,""," ",nil,[]и{}пусты.nil?объекты являются экземплярами NilClass.empty?объекты class-specific, и определение варьируется от класса к классу. Строка пуста, если в ней нет символов, а массив пуст, если в нем нет элементов.
есть ли что-то недостающее или более жесткое сравнение, которое можно сделать?
14 ответов
.nil? может использоваться для любого объекта и имеет значение true, если объект равен нулю.
.empty? может использоваться для строк, массивов и хэшей и возвращает true, если:
- длина строки == 0
- длина массива == 0
- длина хэша == 0
под управлением .empty? на что-то, что Нил бросит NoMethodError.
вот здесь .blank? приходит. Это реализовано Rails и будет работать на любом объекте, а также работать как .empty? на строки, массивы и хэши.
nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false
.blank? также оценивает true для строк, которые не являются пустыми, но содержат только пробелы:
" ".blank? == true
" ".empty? == false
Rails также обеспечивает .present?, который возвращает отрицание .blank?.
попался массива: blank? вернутся false даже если все элементов массива пусты. Чтобы определить пустоту в этом случае, используйте all? С blank?, например:
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
одно отличие в том, что .nil? и .empty? методы, которые предусмотрены языком программирования Ruby, тогда как .blank? что-то добавил в рамках веб-разработки на Rails.
- все это
nil?isblank? - все это
empty?иblank? - ничего
empty?иnil? - ничего
nil?isempty?
tl; dr -- использовать только blank? & present? если вы не хотите, чтобы различать между "" и " "
особый случай-при попытке оценить, является ли логическое значение нулевым:
false.present? == false
false.blank? == true
false.nil? == false
в этом случае рекомендуется использовать .nil?
просто небольшая заметка о any? рекомендация: он прав, что это вообще эквивалентно !empty?. Однако,any? вернутся true к строке только пробелов (ala " ").
и, конечно же, см. комментарий 1.9 выше.
не забудьте any? что это вообще !empty?. В Rails я обычно проверяю наличие чего-то в конце оператора с if something или unless something затем использовать blank? где это необходимо, так как он, кажется, работает везде.
nil? является стандартным методом Ruby, который может быть вызван для всех объектов и возвращает true если объект nil:
b = nil
b.nil? # => true
empty? является стандартным методом Ruby, который может быть вызван для некоторых объектов, таких как строки, массивы и хэши и возвращает true если эти объекты не содержат элемента:
a = []
a.empty? # => true
b = ["2","4"]
b.empty? # => false
empty? не может быть вызван nil объекты.
blank? является методом Rails, который можно вызвать на nil объекты, а также пустые объекты.
все остальные хорошо объяснили, в чем разница.
Я хотел бы добавить в Ruby On Rails, лучше использовать obj.blank? или obj.present? вместо obj.nil? или obj.empty?.
obj.blank? обрабатывает все типы nil, '', [], {}, и возвращает true если значения недоступны и возвращает false если значения доступны для любого типа объекта.
exists? метод может использоваться для проверки того, существуют ли данные в базе данных или нет. Он возвращает логические значения либо true или false.
рельсы 4
альтернатива @corban-brook ' s 'Array gotcha: пустой?' для проверки, если массивы содержат только пустые значения и могут рассматриваться как пустые? правда:
[ nil, '' ].all? &:blank? == true
можно сделать:
[nil, '', "", " ",' '].reject(&:blank?).blank? == true
nil? может использоваться на любом объекте. Он определяет, имеет ли объект какое-либо значение или нет, включая "пустые" значения.
например:
example = nil
example.nil? # true
"".nil? # false
в принципе nil? будет возвращать true только в том случае, если объект фактически равен "nil".
empty? вызывается только для объектов, которые считаются коллекции. Это включает в себя такие вещи, как строки (коллекция символов), хэши (коллекция пар ключ/значение) и массивы (коллекция произвольный объект.) empty? возвращает true, если в коллекции нет элементов.
например:
"".empty? # true
"hi".empty? # false
{}.empty? # true
{"" => ""}.empty? # false
[].empty? # true
[nil].empty? # false
nil.empty? # NoMethodError: undefined method `empty?' for nil:NilClass
обратите внимание, что empty? невозможно вызвать объекты nil, поскольку объекты nil не являются коллекцией, и это вызовет исключение.
также обратите внимание, что даже если элементы в коллекции пусты, это не означает, что коллекция пуста.
blank? в основном представляет собой комбинацию nil? и empty? это полезно для проверки объектов что вы предполагаете-это коллекции, но также может быть nil.


