Ruby: nil? empty? blank? present?

В Ruby on Rails доступны несколько методов для проверки существования значения или состояния объекта. Ruby предлагает nil?, empty? и Rails добавляет blank? и present?. Каждый из методов имеет свою логику и назначение. И конечно предполагает применение в нужном контексте.

nil?

Метод класса Object в Ruby. Что означает его повсеместную доступность. Может применяться ко всем объектам. Но вызов на несуществующем объекте конечно выбросит исключение.

nil.nil?
=> true

true.nil?
=> false

"".nil?
=> false

[].nil?
=> false

empty?

Метод применяемый к строкам, массивам, хешам, наборам. Возвращает true если экземпляр имеет нулевую длину/размер.

"".empty?
=> true

[].empty?
=> true

" ".empty?
=> false

"\n\t".empty?
=> false

[].empty?
=> true

{}.empty?
=> true

Set.new.empty?
=> true

Если объекта не существует или у него нет обработки NoMethodError, при вызове будет выброшено исключение: not_exists_var.empty?.

blank?

Более умный подход к определению, пустой или нет объект

require 'rails'

" ".blank?
=> true

"\t\n".blank?
=> true

{}.blank?
=> true

Set.new.blank?
=> true

[nil].blank?
=> false

["", ""].blank?
=> false

true.blank?
=> false

false.blank?
=> true

nil.blank?
=> true

present?

Метод противоположенный blank?

require 'rails'

" ".present?
=> false

"\t\n".present?
=> false

{}.present?
=> false

Set.new.present?
=> false

[nil].present?
=> true

["", ""].present?
=> true

true.present?
=> true

false.present?
=> false

nil.present?
=> false
nil? empty? blank? present?
1 false NoMethodError false true
"" false true true false
" " false false true false
"\t\n" false false true false
[] false true true false
["s"] false false false true
{} false true true false
{a: 1} false false false true
Set.new false true true false
nil true NoMethodError true false
true false NoMethodError false true
false false NoMethodError true false

defined?

Если переменная существует будет возвращен её тип, если переменной нет nil

a =  1
=> 1

defined?(a)
=> "local-variable"

defined?(b)
=> nil

defined?(c).nil?
=> true

defined?(c).present?
=> false

defined?(puts)
=> "method"

defined? НЕ метод. И не может быть вызван на оъекте.

[].defined?(:size)
=> undefined method `defined?' for []:Array

[].respond_to?(:size)
=> true