Intro to Ruby

Class 2

Practice Discussion

How was the practice? Do you have any questions or concepts that you'd like to discuss?

What we will cover in this section

  • Boolean Expressions and Conditionals
  • Loops
  • Collections

Booleans

A boolean is a basic data type. It can have only two values: true or false.

Boolean Expressions

Code that compares values and returns True or False is called a Boolean expression

  • Test for equality by using `==`. We can't use `=` because that is used for assignment
  • Test for greater than and less than using `>` and `<`

Boolean Expressions cheat sheet

a == b a is equal to b
a != b a does not equal b
a < b a is less than b
a > b a is greater than b
a <= b a is less than or equal to b
a >= b a is greater than or equal to b

Learn more about logical operators in Ruby http://www.tutorialspoint.com/ruby/ruby_operators.htm

Boolean Expressions practice


# try some of these out in IRB
a = 3
b = 4
a != b
a <= 3
a >= 4
a = 5
b = 5
a == b 
c = a == b # Combine comparison and assignment
puts c
3 < 5
                

Remember: Equals does not equal "equals equals"

Further reading on boolean expressions:

http://ruby.learncodethehardway.org/book/ex27.html

Boolean Expressions

A boolean expression evaluates to true or false. It can also have multiple parts, joined by AND (&&) or OR (||).

EXPRESSION EVALUATES TO
true && true true
true && false false
false && false false
true || true true
true || false true
false || false false
not (true && false) true

Let's Develop It

Take a few minutes and experiment with boolean expressions in IRB. You can start with the examples below.


true && false
1 == 1 && 2 > 37
"boop" == "bip" || 7 == 8
false || true 
89 > 88 || 89 < 90
true || not(1 == 1 || 2 == 65)
            

Putting Booleans to Work

So, what's the value of knowing if a statement is true or false? Often, you'll use that to control whether a piece of code will execute or not.


user_guess = gets.chomp.to_i
secret_number = 312

if user_guess < secret_number 
  puts "Too low!"
elsif user_guess > secret_number
  puts "Too high!"
else 
  puts "You guessed it. Wow maybe you're psychic...."
end 
            

Can you tell what this code does?

Conditionals

When we want different code to execute depending on certain criteria, we use a conditional

We achieve this using if statements and boolean expressions.


if x == 5
puts 'x is equal to 5'
end
                

Conditionals

We often want a different block to execute if the statement is false. This can be accomplished using else.


if x == 5
  puts 'x is equal to 5'
else
  puts 'x is not equal to 5'
end
                

Conditionals

The following shows some examples of conditionals with more complex boolean expressions:


# And
if x > 3 && y > 3
  puts 'Both values are greater than 3'
end

# Or 
if x != 0 || y != 0
  puts 'The point x,y is not on the x or y axis'
end

# Not
if not(x > y)
  puts 'x is less than y'
end
                

Chained conditionals

Conditionals can also be chained.

Chained conditionals use elsif to test if additional statements are true. The single 'else' action will only happen if all preceding conditions are false.

For example:


if x > 10
  puts "x is greater than 10"
elsif x <= 10 && x > 0
  puts "x is a number between 1 and 10"
else
  puts "Wow, don't be so negative, dude"
end
                

Let's Develop It

Write a program in your text editor that uses conditionals and user input to allow the user to play an adventure game.

"gets.chomp" is the value of user input at the command line, with the trailing whitespace chomped off. To do math with it, convert it to an integer with the ".to_i" method


                  input = gets.chomp.to_i 
                

Run your program by calling it with Ruby from the command line.


                  $ ruby program_name.rb 
                

Let's Develop It Example


# adventure.rb                   
puts "A vicious dragon is chasing you!"
puts "Options:"
puts "1 - Hide in a cave"
puts "2 - Climb a tree"

input = gets.chomp

if
  ...
end


#command line
ruby dragon.rb
                

Let's Develop It Example


# adventure.rb                   
puts "A vicious dragon is chasing you!"
puts "Options:"
puts "1 - Hide in a cave"
puts "2 - Climb a tree"

input = gets.chomp

if input == '1'
  puts "You hide in a cave. The dragon finds you and asks if you'd like to play Scrabble. Maybe it's not so vicious after all!"
elsif input == '2'
  puts "You climb a tree. The dragon can't find you."
else 
  puts "That's not a valid option."
end 


#command line
ruby dragon.rb
                

Loops

It is often useful to perform a task and to repeat the process until a certain point is reached.

The repeated execution of a set of statements is called iteration, or, more commonly, a loop.

One way to achieve this, is with the while loop.


x = 10

while x > 0
  puts "Loop number #{x}"
  x = x - 1
end 

puts 'Done'
                

While Loops


x = 10

while x > 0
  puts "Loop number #{x}"
  x = x - 1
end 
                

The while statement takes a condition, and as long as it evaluates to true, the code block beneath it is repeated. This creates a loop.

Without the `x = x - 1` statement, to increment the value of x, this would be an infinite loop :( :( :(

While loops

Consider the following example that uses a while loop to sing you a song.


num_bottles = 99

while num_bottles > 0
  puts "#{num_bottles} bottles of beer on the wall, 
  #{num_bottles} bottles of beer, take one down, pass it 
  around, #{num_bottles - 1} bottles of beer on the wall!"

  num_bottles = num_bottles - 1
end 
                

"#{num_bottles}" is an example of string interpolation

Let's Develop It

  • Write a program that obtains user input like the last program
  • This program should not exit until the user says it should (maybe by entering "quit"?)
  • Use a loop!
  • You can use the next slide as an example.

Let's Develop It: Example


# loopy.rb
loopy = true

while loopy == true
  puts "Are we having fun yet?"
  puts "Answer 'true' or 'false'."
  user_input = gets.chomp
  if user_input == 'false'
    loopy = false
  end 
end 
                

Learn more about loops in Ruby: http://www.tutorialspoint.com/ruby/ruby_loops.htm

Each loops

The most commonly used type of loop in Ruby is an each loop. It uses the .each method to iterate over a collection of elements, doing work to each one.

First, we need a collection. Let's use a range of numbers to loop over.


(0..5).each do |i|
  puts "Value of i is #{i}"
end
                

Each loops


(0..5).each do |i|
  puts "Value of i is #{i}"
end
                

The loop has three parts:

  • The collection that will be looped through, in this case a range- "(0..5)"
  • The name to give each element when the loop begins again - "i" - in the pipes "| |"
  • The code to execute with the element - the puts statement

We will revisit the each loop when we have a better understanding of collections.

Collections

There are three main types:

  • Ranges
  • Arrays
  • Hashes

new_range = (1..10)

new_array = [1, 3, 5]

new_hash = {"dog" => "snoopy", "bird" => "woodstock"}
                

Ranges


inclusive_range = (1..3)  # contains 1, 2, 3
exclusive_range = (1...3) # contains 1, 2
letter_range = ('a'..'e') # contains 'a', 'b', 'c', 'd', 'e'
            

Ranges are simply the range of values between the given first and last elements.

Inclusive ranges have two dots, and include the last element. Exclusive ranges have three dots, and do not include the last element.

Ranges need to be defined from lowest value to highest.

Ranges

Try out these range methods in IRB.


(1..99).max
('b'...'z').include?('j')
(890..902).begin
(890..902).first(4)
(890..902).last(3)
(890..902).end
(28..22).min

('a'...'g').each do |l|
  puts "#{l} is a pretty good letter"
end 

(22..28).to_a
            

Learn more about ranges http://www.ruby-doc.org/core-2.1.1/Range.html

Questions?

Homework

Practice: Find two interesting methods for Enumerable (via Ruby Docs http://www.ruby-doc.org/core-2.1.1/Enumerable.html) and write a little program that uses them for arrays or hashes. Do any one the exercises at the end of Chapter 6 of Learn to Program http://pine.fm/LearnToProgram/?Chapter=06.

Prep: Read Chapter 8 of Learn To Program- don't try to do the exercises at the end yet, though.