Использование «gets» для пользовательского ввода

#ruby

#рубиновый

Вопрос:

В настоящее время у меня есть этот код:

 def main()

    info = []
    CSV.foreach('test.csv') do |row|
        info.push(row)
    end

    headers = info.shift

    param = ARGV[0]
    if param.downcase == "action1"
        ans = func1(info, headers)
    elsif param.downcase == "action2"
        puts "Enter a value:n"
        extra_param = gets.chomp
        p func2(info, headers, extra_param)
    else
        puts "Invalid Parameter"
    end

end
 

Когда я пытаюсь запустить это (с ‘action2’ в качестве аргумента командной строки), я получаю сообщение об ошибке, которое гласит:

 :in `gets': No such file or directory - action2 (Errno::ENOENT)
 

Из того, что я собрал, кажется, что «gets» в этом случае не ожидает ввода пользователем, а пытается использовать аргумент командной строки, который я передал, чтобы открыть / прочитать файл. Как мне сделать так, чтобы «gets» вместо этого ожидал ввода пользователем и игнорировал аргумент командной строки?

Комментарии:

1. «Если param == "action1" » означает, что вы не добираетесь до цели gets , верно?

2. Упс, я имел в виду действие 2. Позвольте мне это исправить. Извините!

Ответ №1:

Вместо того , чтобы делать param = ARGV[0] , сделайте param = ARGV.shift , чтобы удалить аргумент из ARGV . В противном случае используйте $stdin.gets , если вы не хотите беспокоиться о ARGV наличии каких-либо входных данных.

Kernel#gets будет считываться из ARGV , поэтому, если вы передали какие-либо аргументы, не сбросив их, вы получите приведенную выше ошибку, так как она пытается выполнить чтение из файла, названного в качестве аргумента.

Комментарии:

1. Спасибо! В итоге я использовал STDIN.gets, отличается ли это от $ stdin.gets?

2. STDIN == $stdin # => true