In Ruby, nil
is a special value. It indicates a value that is not present. Methods often return nil
when they attempt to locate an element that does not exist.
We must check for nil
in many locations in our code. Uninitialized fields in classes are nil
too. Nil is everywhere: without nothing, there cannot be something.
This example shows how nil
is used with the Array class
. We create an array with 3 integer elements. We then call the index method on the array.
nil
.nil
before calling methods on an object. This is shown in the example after this one.# An array of three elements. values = Array[10, 30, 50] # Try to find an element that does not exist. if values.index(70) == nil # This is reached. puts "Result is nil" endResult is nil
NoMethodError
We cannot call methods on the nil
object. This will cause a NoMethodError
. And at this point, program execution ceases. We must first test references to see if they are nil
.
nil
object.string
. But calling length()
on nil
is not possible.# An example hash. hash = Hash["a" => "dog"] # Get an element that does not exist. v = hash["b"] # We cannot use length on it. puts v.length()...undefined method 'length' for nil:NilClass (NoMethodError)
A field in a class
is automatically set to nil
before it is assigned a value. So we can check for nil
to see if a field has been initialized yet.
nil
manually, as with assignment. So nil
is not just for uninitialized variables.class Box def size @value end end # Create a new class instance. x = Box.new # A field on a class is nil until initialized. if x.size == nil puts "NIL" endNIL
nil
Methods return nil
if no other return value is specified. Often, nil
is returned when no value can be found. Here, analyze()
returns nil
unless "n" equals 2.
def analyze(n) # This method returns nil unless n equals 2. if n == 2 return n * 2 end end puts "Result is nil" if analyze(3) == nilResult is nil
Any class
in Ruby can be nil
. If our program logic can possibly result in a nil
object, we must first test for nil
to prevent errors.