stltqhs
stltqhs

Reputation: 116

a crux about nil test in ruby code

I have a crux in ruby code(excerpt from this page):

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  #create the object
  def initialize(names = "World")
     @names = names
  end

  # say hi to everybody
  def say_hi
    if @names.nil?
      puts "..."
    elseif @names.respond_to?("each")
      # @names is a list of some kind,iterate!
      @names.each do |name|
         puts "Hello #{name}!"
      end
    else
      puts "Hello #{@names}!"
    end
  end

  # say bye to everybody
  def say_bye
    if @names.nil?
      puts "..."
    elseif @names.respond_to?("join")
      puts "Goodbye #{@names.join(",")}. Come back soon."
    else
      puts "Goodbye #{@names}. Come back soon."
    end
  end
end

if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # change the name to an array of names
  mg.names = ["Albert", "Brenda", "Charles", "Dave", "Engelbert"]
  mg.say_hi
  mg.say_bye

  # change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye

end

When I run this script with ruby command, it prints:

Hello World!
Goodbye World. Come back soon.
Hello Zeke!
Goodbye Zeke. Come back soon.
Hello ["Albert", "Brenda", "Charles", "Dave", "Engelbert"]!
Goodbye ["Albert", "Brenda", "Charles", "Dave", "Engelbert"]. Come back soon.
...
ri20min.rb:15:in `say_hi': undefined method `elseif' for #<MegaGreeter:0x00000001a2d4a0 @names=nil> (NoMethodError)
        from ri20min.rb:54:in `<main>'

I want to check whether a variable is nil.

if @names.nil?

But the error frustrated me! It seems that a nil object has not nil method! How can I amend this code to run correctly.

Upvotes: 0

Views: 39

Answers (1)

potashin
potashin

Reputation: 44581

There is no elseif in ruby, but there is elsif.

Upvotes: 3

Related Questions