Philpot Philpot - 21 days ago 11
Ruby Question

How do I combine gets.chomp and ARGV in Ruby?

I'm new to learning ruby and currently stuck on having ARGV and gets.chomp in the same script.

I want the script to unpack 3 arguments first then I'll ask a question (gets.chomp) and then print string which includes one of the ARGV and gets.chomp variables. In the terminal I'm setting the ARGV as one two three (example: ruby file1.rb one two three). Example below of code:

first, second, third = ARGV

puts "Your first variable is: #{first}"
puts "Your second variable is: #{second}"
puts "Your third variable is: #{third}"


This works exactly how I would expect. In the terminal, it gives me one, two and three as variables in first, second and third.

I've added in a puts "What is your favourite colour" and this prints out as expected but when I set a gets.chomp for the input, I get an error.

first, second, third = ARGV

puts "Your first variable is: #{first}"
puts "Your second variable is: #{second}"
puts "Your third variable is: #{third}"

puts "What is your favourite colour? "
colour = gets.chomp #this is where the error occurs

puts "So your favourite number is #{first} and you like the colour #{colour}."


^The bottom line is what I want to print but I get an error at gets.chomp

This is what the terminal prints:

$ ruby ex13.rb one two three
Your first variable is: one
Your second variable is: two
Your third variable is: three
What is your favourite colour?
ex13.rb:8:in `gets': No such file or directory - one (Errno::ENOENT)
from ex13.rb:8:in `gets'
from ex13.rb:8:in `<main>'


I hoped I've explained the above well enough and let me know if any more information is needed.

Any help will be greatly appreciated!

Thanks,

Answer

I answered a question about this yesterday, which you can read here, but to address your situation specifically:

After first, second, third = ARGV, call ARGV.clear to empty it out.

Alternatively you could do first, second, third = 3.times.map { ARGV.shift }

The reason is that gets reads from ARGV if there's anything in it. You need to empty ARGV out before calling gets.

Comments