2013-05-19 3 views
0

я испытал некоторое странное поведение из приведенного ниже кода:Рубин получает метод генерирует исключение, когда аргументы передаются из консоли

require 'CSV' 

$DEBUG = ARGV.empty? ? false : ARGV[0] #Global debug flag. 

class PhoneBook 
    #class code here etc etc 
end 

PhoneBook.start_dir = "file-io-samples/phonebooks/" 
puts "Enter a phonebook!" 
name = gets #This is the problem. 
puts "Using #{name}.." 

Когда я прохожу верно иметь $DEBUG значение ИСТИНА об исполнении я получаю ошибку от name = gets, и я понятия не имею, почему. Если я не передаю параметры через командную строку, все работает нормально.

Это ошибка выхода:

C:\Pickaxe>ruby PhoneBook.rb 
Enter a phonebook! 
Hurrah! Works 
Using Hurrah! Works 
.. 

C:\Pickaxe>ruby PhoneBook.rb true 
Enter a phonebook! 
Exception `Errno::ENOENT' at PhoneBook.rb:62 - No such file or directory - true 
PhoneBook.rb:62:in `gets': No such file or directory - true (Errno::ENOENT) 
     from PhoneBook.rb:62:in `gets' 
     from PhoneBook.rb:62:in `<main>' 

C:\Pickaxe> 

Если мне нужно, я могу опубликовать определение класса, но я не думаю, что это часть проблемы.

ответ

1

gets читает из stdin, если аргументы не переданы, и из файла, который был передан в качестве аргумента в противном случае. Вы передаете аргумент true, ergo gets пытается прочитать из файла с именем true, который, по-видимому, не существует.

Это очень первое предложение документации gets:

Возвращает (и присваивает $_) следующую строку из списка файлов в ARGV (или $*)

1

Это не вызовет проблемы с * nix, но я ожидаю, что Windows или Ruby на Windows не будут обрабатывать дополнительный параметр командной строки таким же образом. В * nix мы можем использовать -- между именем сценария и параметром, чтобы сообщить ОС не передавать параметр в качестве флага. Другими словами, Ruby не увидит true, ваш скрипт будет.

ruby some_script.rb -- options 

Но, в общем, я думаю, что вы делаете это неправильно, и рекомендовать обработку параметры командной строки в стандартном способе, используя OptionParser класс:

require 'optparse' 

OptionParser.new do |opt| 
    opt.on('-d', '--[no-]debug') { |o| $DEBUG = o } 
end.parse! 

puts $DEBUG 

Запуска, что несколько раз на моя система Mac OS, с различными параметрами, дает мне:

$ ruby test.rb 
false 
$ ruby test.rb --no-debug 
false 
$ ruby test.rb -d 
true 
$ ruby test.rb --debug 
true 

Вы можете все равно придется использовать -- сказать ОС и называется приложение, которое PARAMET принадлежат к чему.

+0

+1 для предложения OptionParser. Я все понял. При более повторном поиске получает естественный поиск аргументов ARGV для извлечения файлов в аргументы. Мне тоже пришлось использовать $ stdin.gets. Должен быть таким же, как на * nix – Senjai

 Смежные вопросы

  • Нет связанных вопросов^_^