Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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,

like image 945
Philpot Avatar asked Nov 13 '16 21:11

Philpot


1 Answers

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.

like image 172
max pleaner Avatar answered Nov 14 '22 16:11

max pleaner