Краткое объяснение nil v. Empty v. Blank в Ruby on Rails - PullRequest
1062 голосов
/ 20 мая 2009

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

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

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

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

Чего-то не хватает, или можно сделать более точное сравнение?

Ответы [ 14 ]

1372 голосов
/ 20 мая 2009

.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?.

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

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
641 голосов
/ 18 декабря 2013

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

enter image description here

blank?, present? предоставляются Rails.

199 голосов
/ 12 ноября 2014

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

enter image description here

Ссылка: пусто? Пусто? Ноль? 傻傻 分不清楚

58 голосов
/ 13 июля 2010

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

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

47 голосов
/ 20 мая 2009

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

27 голосов
/ 15 января 2018

enter image description here

  • Все, что является nil?, является blank?
  • Все, что является empty?, является blank?
  • Ничего, что empty? не является nil?
  • Ничего, что nil? не является empty?

tl; dr - используйте только blank? & present?, если вы не хотите различать "" и " "

12 голосов
/ 14 ноября 2012

Особый случай - при попытке оценить, имеет ли логическое значение ноль:

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

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

10 голосов
/ 13 июля 2009

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

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

9 голосов
/ 20 мая 2009

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

8 голосов
/ 22 декабря 2014

nil? - это стандартный метод Ruby, который может быть вызван для всех объектов и возвращает true, если объект nil:

b = nil
b.nil? # => true

empty? - это стандартный метод Ruby, который можно вызывать для некоторых объектов, таких как Strings, Arrays и Hashes, и возвращает true, если эти объекты не содержат элемента:

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty? нельзя вызывать для nil объектов.

blank? - это метод Rails, который можно вызывать как для nil объектов, так и для пустых объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...