sneakycrow
sneakycrow

Reputation: 65

Console printing backwards

I'm trying to get the code to print the name of a class and then greetings on the same line. For example:

(DriveThru): Hi, welcome to Starbucks! What can I get started for you?

Here's my code:

module Order
  def order_drink
    "(#{self.class.name}): #{self.greeting}"
  end
end

class Lobby
  include Order
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def greeting
    puts "Hi, welcome to Starbucks! How are you doing today #{self.name}?"
  end
end

class DriveThru
  include Order
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def greeting
    puts "Hi, welcome to Starbucks! What can I get started for you #{self.name}?"
  end
end

dt = DriveThru.new("Tom")
lb = Lobby.new("Jessica")

puts dt.order_drink
puts lb.order_drink

When I run the code, it prints the greeting first, line breaks, then prints the class name like this:

"Hi, welcome to Starbucks! What can I get started for you?"
(DriveThru):

What am I'm doing wrong?

Upvotes: 0

Views: 60

Answers (1)

Aeyrix
Aeyrix

Reputation: 168

Your greeting function is executing the puts statement. Due to the way Ruby (and most other programming languages) works, the order_drink method will evaluate the contents of the greeting method (calling a puts statement) first before returning its own value.

Dropping the puts at the beginning of each greeting function, for example:

class Lobby
  include Order
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def greeting
    "Hi, welcome to Starbucks! How are you doing today #{self.name}?"
  end
end

This will cause your script to output the following:

(DriveThru): Hi, welcome to Starbucks! What can I get started for you Tom?
(Lobby): Hi, welcome to Starbucks! How are you doing today Jessica?

That said, it'd be preferable to add an attr_reader for the greeting attribute, and set its value in the initialize method (also known as the constructor), like so:

class Lobby
  include Order
  attr_reader :name, :greeting
  def initialize(name)
    @name = name
    @greeting = "Hi, welcome to Starbucks! How are you doing today #{name}?"
  end
end

Upvotes: 2

Related Questions