Краткое объяснение 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
одно отличие в том, что .nil?
и .empty?
методы, которые предусмотрены языком программирования Ruby, тогда как .blank?
что-то добавил в рамках веб-разработки на Rails.
- все это
nil?
isblank?
- все это
empty?
иblank?
- ничего
empty?
иnil?
- ничего
nil?
isempty?
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.