ЗмістНатисність на посилання, щоб перейти до потрібного місця
У Ruby та Rails часто можна побачити методи blank?, present?, empty? і nil?. Вони здаються схожими, але насправді мають різні джерела і поведінку. Розберімося, коли який метод варто використовувати.
nil? - базовий метод Ruby
Метод nil? є частиною Ruby. Він повертає true, якщо об’єкт - це саме nil.
nil.nil? # => true "".nil? # => false [].nil? # => false 0.nil? # => false
Використовується для перевірки, чи взагалі є об’єкт.
empty? — для колекцій та рядків
Метод empty? визначений у класах String, Array, Hash, Set та деяких інших. Він перевіряє, чи колекція або рядок порожні, тобто не містять елементів або символів.
"".empty? # => true
[].empty? # => true
{}.empty? # => true
nil.empty? # => NoMethodError
Якщо об’єкт не підтримує empty?, отримаєте помилку. Тому цей метод варто використовувати лише тоді, коли ви точно знаєте тип змінної.
blank? - з ActiveSupport (Rails)
Метод blank? з’являється завдяки бібліотеці ActiveSupport, яка йде разом із Rails. Він є більш "розумною" версією empty?, тому що враховує і nil, і пробіли, і порожні колекції.
nil.blank? # => true
"".blank? # => true
" ".blank? # => true
[].blank? # => true
{}.blank? # => true
false.blank? # => true
0.blank? # => false
blank? зручно використовувати в Rails-коді, коли потрібно перевірити “порожнечу” будь-якого об’єкта без винятків.
present? - з ActiveSupport (Rails)
Метод present? - це просто протилежність blank?. Він повертає true, якщо об’єкт не порожній.
"Ruby".present? # => true "".present? # => false nil.present? # => false [1, 2].present? # => true
Використовується для умов:
puts "Hello!" if name.present?
Коротко:
- nil? - стандартний Ruby, перевіряє лише nil.
- empty? - стандартний Ruby, для колекцій та рядків тощо.
- blank? - з ActiveSupport, враховує і nil, і пробіли, і пусті колекції.
- present? - з ActiveSupport, протилежний до blank?.
Коли що використовувати
- Якщо пишете чистий Ruby без Rails - використовуйте nil? і empty?.
- Якщо у вас Rails або ActiveSupport - частіше зручно blank? / present?, бо вони охоплюють усі випадки та не викликають помилки на nil.
Цей допис поки що не має жодних доповнень від автора/ки.