Question on If @Instance Statements

I have another Chris P. “Learning Programming” Question. I’m almost
finished with the book but became confused on his use of “If”
statements.

QUESTION: In the below code snippet, why does he use “if @asleep
instead of just writing “passageOfTime”, “puts”, and then, “if @asleep =
false”?

This is the same question I have for other parts of the program that use
“if @asleep” so I guess clarifying this will help me understand how it
is being used. Thanks!

def putToBed
puts ‘You put ’ + @name + ’ to bed.’
@asleep = true
3.times do
if @asleep
passageOfTime
end
if @asleep
puts @name + ’ snores, filling the room with smoke.’
end
end
if @asleep
@asleep = false
puts @name + ’ wakes up slowly.’
end
end

FULL PROGRAM FOLLOWS BELOW:

class Dragon

def initialize name
@name = name
@asleep = false
@stuffInBelly = 10 # He’s full.
@stuffInIntestine = 0 # He doesn’t need to go.

puts @name + ' is born.'

end

def feed
puts 'You feed ’ + @name + ‘.’
@stuffInBelly = 10
passageOfTime
end

def walk
puts 'You walk ’ + @name + ‘.’
@stuffInIntestine = 0
passageOfTime
end

def putToBed
puts ‘You put ’ + @name + ’ to bed.’
@asleep = true
3.times do
if @asleep
passageOfTime
end
if @asleep
puts @name + ’ snores, filling the room with smoke.’
end
end
if @asleep
@asleep = false
puts @name + ’ wakes up slowly.’
end
end

def toss
puts ‘You toss ’ + @name + ’ up into the air.’
puts ‘He giggles, which singes your eyebrows.’
passageOfTime
end

def rock
puts ‘You rock ’ + @name + ’ gently.’
@asleep = true
puts ‘He briefly dozes off…’
passageOfTime
if @asleep
@asleep = false
puts ‘…but wakes when you stop.’
end
end

private

“private” means that the methods defined here are

methods internal to the object. (You can feed

your dragon, but you can’t ask him if he’s hungry.)

def hungry?
# Method names can end with “?”.
# Usually, we only do this if the method
# returns true or false, like this:
@stuffInBelly <= 2
end

def poopy?
@stuffInIntestine >= 8
end

def passageOfTime
if @stuffInBelly > 0
# Move food from belly to intestine.
@stuffInBelly = @stuffInBelly - 1
@stuffInIntestine = @stuffInIntestine + 1
else # Our dragon is starving!
if @asleep
@asleep = false
puts ‘He wakes up suddenly!’
end
puts @name + ’ is starving! In desperation, he ate YOU!’
exit # This quits the program.
end

if @stuffInIntestine >= 10
  @stuffInIntestine = 0
  puts 'Whoops!  ' + @name + ' had an accident...'
end

if hungry?
  if @asleep
    @asleep = false
    puts 'He wakes up suddenly!'
  end
  puts @name + '\'s stomach grumbles...'
end

if poopy?
  if @asleep
    @asleep = false
    puts 'He wakes up suddenly!'
  end
  puts @name + ' does the potty dance...'
end

end

end

Hi,

Michael S. wrote in post #1064257:

QUESTION: In the below code snippet, why does he use “if @asleep
instead of just writing “passageOfTime”, “puts”, and then, “if @asleep =
false”?

I’m not quite sure what you mean by “if @asleep = false”. Anyway, you
cannot leave out the if statement. You cannot even put the
“passageOfTime” and the “puts” into a single if statement, because the
“passageOfTime” may change the value of @asleep.

The dragon may wake up during passageOfTime (when he’s hungry or poopy).
So after passageOfTime you have to check again if he’s still asleep.