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