Краткое объяснение 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 

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

enter image description here

blank?, present? обеспечены рельсами.


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

enter image description here

Ref:пустой?пустой?шь?傻傻分不清楚


подсказка: !obj.blank? == obj.present?

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


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


enter image description here

  • все это nil? is blank?
  • все это empty? и blank?
  • ничего empty? и nil?
  • ничего nil? is empty?

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.