Transcript:
Hello everybody and welcome to Programming With Ruby Episode 9, Flow
Control. I'm Tyler and this video is brought to you by manwithcode.com
So far all of the programs and code that I have shown you has been
completely linear. There has been no way to loop based on a condition
or do something based on what the user inputs.
In this episode I will be showing you how to do all this, and I will
also be explaining to you what a code block is, since I've been
mentioning them in almost every episode previous to this.
This episode is REALLY LONG! Feel free to pause the video and think
about what's been said or try out code yourself.
Code Blocks
Throughout the previous videos, I've been telling you about code
blocks, I've also been telling you I'll teach you what they are in a
later episode. That episode has finally come.
Code blocks look something like this:
[sourcecode language="ruby"]
my_array.each do |item|
puts item
end
[/sourcecode]
or like this:
[sourcecode language="ruby"]
my_array.each { |item| puts item }
[/sourcecode]
Both of those actually do the same thing! The .each method takes a
block as an argument. The block is what is between the do and end
keywords, or the curly braces, depending on which format you use.
The item between the pipe characters (which is above the ENTER key) is
the variable the .each method gives you (in this case the item in the
array).
The rest of the code block is just normal Ruby code. Not so complicated, eh?
(Keep in mind that there are more metheds besides .each that take code blocks)
If, Else, and Unless
A basic if statement would look like this:
[sourcecode language="ruby"]
x = 3
if x < 5
# Do something
end
[/sourcecode]
The "x < 5" is the condition that has to be true for the code to
run. If that condition is true, the code between the "if" and "end"
keywords is run.
There are many different conditional operators you can use:
[sourcecode language="ruby"]
==
<
>
<=
>=
!=
[/sourcecode]
Just be sure to keep in mind that the "is equal" operator uses two
equal signs, not one.
If you would like code that is run when the condition is false:
[sourcecode language="ruby"]
x = 3
if x < 5
# Do something if true
else
# Do something if false
end
[/sourcecode]
In a similar way you can execute code if the first condition is false
but a second is true:
[sourcecode language="ruby"]
x = 3
if x < 5
# Do something if true
elsif x == 3
# Do something if the first is false and this is true
else
# Do something in all are false
end
[/sourcecode]
In a different way you can only execute the code if two conditions are true:
[sourcecode language="ruby"]
x = 3
y = 2
if x == 3 and y == 2
# Do something
end
[/sourcecode]
You can also only execute code if one of any conditions are true:
[sourcecode language="ruby"]
x = 3
y = 4
if x == 3 or y == 2
# Do something
end
[/sourcecode]
There is also the evil twin brother of if, unless:
[sourcecode language="ruby"]
x = 3
unless x == 3
# if x is 3, this code will not run
end
[/sourcecode]
You can chain all of these together in almost any way you choose.
Case, When
Another way to evaluate conditions is using case, when:
[sourcecode language="ruby"]
x = 3
case x
when 1 then
# do something
when 3 then
# do something
else
# do something if none are true
end
[/sourcecode]
You can't do many complex conditionals, but it can be nicer than a
long chain of if, else's
while, until, and for loops
Similarly to the above if statements, while, until, and for loops will
execute code based on a condition, but they will do it multiple times.
while:
[sourcecode language="ruby"]
x = 1
while x < 5
x += 1
puts x
end
[/sourcecode]
Similar to the relationship between if, and unless. while has an evil
sister, until
[sourcecode language="ruby"]
x = 1
until x > 5
x += 1
puts x
end
[/sourcecode]
There are also for loops, which allow you to iterate over something
[sourcecode language="ruby"]
foods = ["ham", "eggs", "cheese"]
for food in foods
puts food += " is yummy!"
end
[/sourcecode]
There is also .each, for's evil stepchild:
[sourcecode language="ruby"]
foods = ["ham&", "eggs", "cheese"]
foods.each do |food|
puts food += " is yummy!"
end
[/sourcecode]
Concrete Example
A menu system
[sourcecode language="ruby"]
input = ""
until input == 'quit'
puts "
Menu
(1) Hi!
(2) Credits
(3 or quit) Exit
"
input = gets.chomp!
case input
when "1" then
puts "Hi!"
when "2" then
puts "Written By: Tyler"
when "3" then
input = 'quit'
else
puts "Invalid input"
end
end
[/sourcecode]
Lets break it down.
First we set the input variable to an empty string (so the second line
dosen't give us an error)
Then we use an until loop that quits when input is equal to 'quit'
Next we print the menu (which is unindented so it doesn't print to the
screen indented)
After that we get input from the user, use .chomp! to remove the
newline character created from pressing ENTER, and put the input into
the input variable
Then we have a case statement, when "1" we print "Hi!", when "2" we
print who it was created by, when "3" we quit, otherwise we print out
"Invalid input" to tell the user they entered something wrong.
This brings us to the end of the video.
If you like these videos please donate, because I'm doing this all for free
If you have any questions, comments, or suggestions, you can leave a
comment on this page. Or you can email me at [email protected]
I covered a lot of material in this episode and I urge you to watch it
again, go to the original post and look at the code (link is in the
description) and write some code yourself.
Thank you very much for watching, goodbye!
For the menu system, is it possible to assign values to their selection that is stored and can be used to add to the value of another menu system? I love your videos!
Comments
William on
For the menu system, is it possible to assign values to their selection that is stored and can be used to add to the value of another menu system? I love your videos!