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

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

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

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

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

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

Ответы [ 14 ]

4 голосов
/ 20 мая 2015

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

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

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

3 голосов
/ 17 февраля 2016

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

2 голосов
/ 19 августа 2015

Рельсы 4

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

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

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

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
1 голос
/ 15 сентября 2015

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.

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