### Using Loops for prompts with If/Else/Esif

1

I started with:

``````    puts "Hello there, and what's your favorite number?"
favnum = gets.to_i
puts "Your favorite number is #{favnum}?" " A better favorite number is #{favnum + 1}!"
puts "Now, what's your favorite number greater than 10?"
favnumOverTen = gets.to_i
if favnumOverTen < 10
puts "Hey! I said GREATER than 10! Try again buddy."
else
puts "Your favorite number great than 10 is #{favnumOverTen}?"
puts "A bigger and better number over 10 is #{favnumOverTen * 10}!"
puts "It's literally 10 times better!"
end
``````

That worked fine, but if the user entered a number less than 10 the program ended. I want the user to be prompted to try again until they enter a number greater than 10. Am I supposed to do that with a loop?

Here's what I took a swing at, but clearly it's wrong:

``````    puts "Hello there, and what's your favorite number?"
favnum = gets.to_i
puts "Your favorite number is #{favnum}?" " A better favorite number is #{favnum + 1}!"
puts "Now, what's your favorite number greater than 10?"
favnumOverTen = gets.to_i
if favnumOverTen < 10
loop.do
puts "Hey! I said GREATER than 10! Try again buddy."
favnumOverTen = gets.to_i
until favnumOverTen > 10
else
puts "Your favorite number great than 10 is #{favnumOverTen}?"
puts "A bigger and better number over 10 is #{favnumOverTen * 10}!"
puts "It's literally 10 times better!"
end
``````
2012-04-03 23:23
by Dante

1

A better solution would be to get the favorite number of 10 once, then start an `until` loop checking for `favnumOverTen > 10` like this:

``````puts "What is your favorite number greater than 10?"
favnumOverTen = gets.to_i
until favnumOverTen > 10 do
puts "Hey! I said GREATER than 10! Try again buddy."
favnumOverTen = gets.to_i
end
``````

This way, if the initial entry is greater than 10, the until loop is never executed (saves you the `if` statement).

Also, just so you're aware, it's not considered idiomatic Ruby to write variable names using camel case (i.e. `favnumOverTen` should be `favnum_over_ten`).

2012-04-03 23:57
by Paul Simpson
Thanks for the tip about camel case. The book I was reading said to use it. It seems a lot of Ruby code is just based around personal preference. I prefer the way you did it because it offers readability, however at the same time it makes lines a little longer. I'll have to figure out which one I like best.. - Dante 2012-04-04 03:34

4

Here's a way that's a little shorter than the previous two:

``````puts "Now, what's your favorite number greater than 10?"
until (favnumOverTen = gets.to_i) > 10
puts "Hey! I said GREATER than 10! try again buddy."
end
``````

This works because assignment returns the value assigned to the variable.

2012-04-04 00:06
by Jwosty
+1 that's nicely done - joelparkerhenderson 2012-04-04 00:08
This works, and is certainly not a bad way to illustrate that "everything in Ruby returns something", however I feel like for just two lines you are giving up a lot of readability - Paul Simpson 2012-04-04 00:13
@PaulSimpson The way you did it is a little repetitive (two duplicate lines), that's why I made this post. You've probably seen the `while line = gets ...` example many a tim - Jwosty 2012-04-04 00:26
@joelparkerhenderson Thanks - Jwosty 2012-04-04 00:26
Thank you! The syntax of when I can use what where is kicking my butt. With help from people like you, I'll get through this - Dante 2012-04-04 03:36