#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