Краткое пояснение nil v. Empty v. Blank в Ruby on Rails

Я постоянно искал четкое определение различий в nil?, blank? и empty? в Ruby on Rails. Вот ближайший я пришел:

  • blank? объекты являются ложными, пустыми или пробельными строками. Например, "", " ", nil, [] и {} пусты.

  • nil? объекты являются экземплярами NilClass.

  • empty? объекты относятся к классу, и определение варьируется от класса к классу. Строка пуста, если она не имеет символов, а массив пуст, если не содержит элементов.

Есть ли что-то недостающее или более точное сравнение, которое можно сделать?

876
задан 20 мая '09 в 1:51
источник поделиться
13 ответов

.nil? может использоваться для любого объекта и является истинным, если объект равен нулю.

.empty? может использоваться для строк, массивов и хэшей и возвращает true, если:

  • Длина строки == 0
  • Длина массива == 0
  • Длина хеша == 0

Запуск .empty? на то, что является nil, будет бросать 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?.

Массив getcha: blank? вернет false, даже если все элементы массива пустые. Чтобы определить пустоту в этом случае, используйте all? с blank?, например:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
1188
ответ дан 20 мая '09 в 19:14
источник

Я сделал эту полезную таблицу со всеми случаями:

enter image description here

544
ответ дан 18 дек. '13 в 19:29
источник

Просто растяните таблицу Джулиана:

введите описание изображения здесь

Ссылка: empty? blank? nil? 傻傻 分不清楚

134
ответ дан 12 нояб. '14 в 3:20
источник

Быстрый совет: !obj.blank? == obj.present?

Может быть удобнее/проще на глазах в некоторых выражениях

54
ответ дан 13 июля '10 в 14:33
источник

Одно отличие состоит в том, что .nil? и .empty? - это методы, которые предоставляются языком программирования Ruby, тогда как .blank? - это что-то добавлено с помощью среды разработки Rails.

43
ответ дан 20 мая '09 в 2:42
источник

Небольшая заметка о рекомендации any?: он прав, что он обычно эквивалентен !empty?. Однако any? возвращает true в строку только пробела (ala " ").

И, конечно, см. также комментарий выше 1.9.

8
ответ дан 13 июля '09 в 22:25
источник

Частным случаем является попытка оценить, является ли логическое значение равным nil:

false.present? == false
false.blank? == true
false.nil? == false

В этом случае рекомендуется использовать .nil?

7
ответ дан 14 нояб. '12 в 16:56
источник

Не забывайте any?, который обычно !empty?. В Rails я обычно проверяю наличие чего-либо в конце инструкции с помощью if something или unless something, а затем используйте blank? там, где это необходимо, так как он работает повсюду.

7
ответ дан 20 мая '09 в 2:51
источник

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, а также пустых объектах.

6
ответ дан 22 дек. '14 в 8:41
источник

exists? метод может использоваться для проверки наличия данных в базе данных или нет. Он возвращает логические значения либо true, либо false.

2
ответ дан 17 февр. '16 в 14:25
источник

Все остальные хорошо объяснили, в чем разница.

Я хотел бы добавить Ruby On Rails, лучше использовать obj.blank? или obj.present? вместо obj.nil? или obj.empty?.

obj.blank? обрабатывает все типы nil, '', [], {} и возвращает true, если значения недоступны и возвращает false, если значения доступны для любого типа объекта.

1
ответ дан 20 мая '15 в 10:55
источник

Рельсы 4

альтернатива @corban-brook 'Array gotcha: blank?' для проверки, содержит ли массивы только пустые значения и может считаться пустой? верно:

[ nil, '' ].all? &:blank? == true

можно также сделать:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
1
ответ дан 19 авг. '15 в 16:52
источник

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.

1
ответ дан 15 сент. '15 в 15:06
источник

Другие вопросы по меткам или Задайте вопрос