Difference between .nil?, .blank? and .empty?
In Ruby, nil
in an object (a single instance of the class NilClass
). This means that methods can be called on it. nil?
is a standard method in Ruby that can be called on all objects and returns true
for the nil
object and false
for anything else.
empty?
is a standard Ruby method on some objects like Arrays, Hashes and Strings. Its exact behaviour will depend on the specific object, but typically it returns true
if the object contains no elements.
blank?
is not a standard Ruby method but is added to all objects by Rails and returns true
for nil
, false
, empty, or a whitespace string.
Because empty?
is not defined for all objects you would get a NoMethodError
if you called empty?
on nil
so to avoid having to write things like if x.nil? || x.empty?
Rails adds the blank?
method.
After answering, I found an earlier question, "How to understand nil vs. empty vs. blank in Rails (and Ruby)", so you should check the answers to that too.
How to understand nil vs. empty vs. blank in Ruby
.nil?
can be used on any object and is true if the object is nil.
.empty?
can be used on strings, arrays and hashes and returns true if:
- String length == 0
- Array length == 0
- Hash length == 0
Running .empty?
on something that is nil will throw a NoMethodError
.
That is where .blank?
comes in. It is implemented by Rails and will operate on any object as well as work like .empty?
on strings, arrays and hashes.
nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false
.blank?
also evaluates true on strings which are non-empty but contain only whitespace:
" ".blank? == true
" ".empty? == false
Rails also provides .present?
, which returns the negation of .blank?
.
Array gotcha: blank?
will return false
even if all elements of an array are blank. To determine blankness in this case, use all?
with blank?
, for example:
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
Testing for empty or nil-value string
The second clause does not need a !variable.nil?
check—if evaluation reaches that point, variable.nil
is guaranteed to be false (because of short-circuiting).
This should be sufficient:
variable = id if variable.nil? || variable.empty?
If you're working with Ruby on Rails, Object.blank?
solves this exact problem:
An object is blank if it’s false, empty, or a whitespace string. For example,
""
," "
,nil
,[]
, and{}
are all blank.
Is there a Ruby, or Ruby-ism for not_nil? opposite of nil? method?
when you're using ActiveSupport, there's user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F, to check just for non-nil, why not use
def logged_in?
user # or !!user if you really want boolean's
end
Nil and boolean in Ruby
The statement goes through the conditions in order, will stop when a falsy result is obtained and return the value of the last evaluation performed.
In contrary to &&
which stops at a falsy value, ||
will stop at a truthy value instead.
Check if Variable is Empty - Angular 2
Lets say we have a variable called x, as below:
var x;
following statement is valid,
x = 10;
x = "a";
x = 0;
x = undefined;
x = null;
1. Number:
x = 10;
if(x){
//True
}
and for x = undefined
or x = 0
(be careful here)
if(x){
//False
}
2. String x = null
, x = undefined
or x = ""
if(x){
//False
}
3 Boolean x = false
and x = undefined
,
if(x){
//False
}
By keeping above in mind we can easily check, whether variable is empty, null, 0 or undefined in Angular js. Angular js doest provide separate API to check variable values emptiness.
Related Topics
How to Inspect the Methods of a Ruby Object
How to Configure an Extra/Different Migrations Folder
How to Use an Actionview::Helper in a Ruby Script, Outside of Rails
Gem Install Nokogiri -V '1.6.8.1' Fails
Rbenv Build Failed on Ubuntu 14.04
How to Reference an Embedded Document in Mongoid
$ Bundle Exec Rake Db:Reset Command Raising Couldn't Drop Db/Development.Sqlite3
Ruby Singleton Methods for Class and Objects
Installing Ruby 2.3.X on Ubuntu 18.04 Is Causing an Error by the End of the Installation Process
Are There Unintended Consequences of Ruby's 'Begin ... End' Without 'Rescue' Used as a Code Block
How to Create Database from Schema.Rb Without Initializing Rails
How to Make a Rake Task Run After All Other Tasks? (I.E. a Rake Afterbuild Task)