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

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

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

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

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

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

Ответ 1

.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 

Ответ 2

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

enter image description here

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

Рельсы 4

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

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

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

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true

Ответ 13

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.