Friday 19 January 2018

A concise explanation of nil v. empty v. blank in Ruby on Rails

itemprop="text">


I find myself repeatedly
looking for a clear definition of the differences of nil?,
blank?, and empty? in Ruby on Rails.
Here's the closest I've
come:




  • blank?
    objects are false, empty, or a whitespace string. For example,
    "", " ", nil,
    [], and {} are
    blank.


  • nil?
    objects are instances of
    NilClass.


  • empty?
    objects are class-specific, and the definition varies from class to class. A string is
    empty if it has no characters, and an array is empty if it contains no
    items.




Is there
anything missing, or a tighter comparison that can be made?



Answer





.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 href="http://apidock.com/rails/Object/blank%3F" rel="noreferrer">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


href="http://apidock.com/rails/Object/presence" rel="noreferrer">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


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...