Caution: We must test for nil before calling methods on an object. This is shown in the example after this one.
Ruby program that uses nil# 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"
Result 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.
Not found: In this example, we access an element in a Hash that is not found. The Hash lookup returns a nil object.
Tip: Try changing the hash["b"] lookup to use instead the key "a". The program will proceed without an error. The key exists.
Ruby program that causes NoMethodError# An example hash.
hash = Hash["a" => "dog"]
# Get an element that does not exist.
v = hash["b"]
# We cannot use length on it.
...undefined method 'length' for nil:NilClass (NoMethodError)
Uninitialized fields. 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.Class
Note: Any variable can be assigned nil manually, as with assignment. So nil is not just for uninitialized variables.
Ruby program that shows nil field
# Create a new class instance.
x = Box.new
# A field on a class is nil until initialized.
if x.size == nil
Return 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.Methods, Return
Ruby program that has method, returns nil
# This method returns nil unless n equals 2.
if n == 2
return n * 2
puts "Result is nil" if analyze(3) == nilOutput
Result is nil
A nil review. Any class in Ruby can be nil. If our program logic can possibly result in a nil object, we must first test for nil.if
This avoids errors, such as NoMethodError, that cause havoc in programs. Many statements must be written with nil in mind. Arrays, hashes and methods all involve nil values.