У меня Windows 8.1, и у меня тоже была эта проблема. Мой учитель сказал мне, что это, вероятно, потому что мой сервер MySQL перестал работать. Она сказала мне, чтобы я зашел в утилиту «Управление компьютером» (щелкните правой кнопкой мыши в нижнем левом углу экрана в Windows 8.1, чтобы получить доступ к управлению компьютером). Затем в разделе «Службы и приложения» откройте Службы и найдите MySQL. Вы должны иметь возможность щелкнуть правой кнопкой мыши MySQL и перезапустить его.
Вот стандартный метод, который я обычно использую:
#!/usr/bin/env ruby
def usage(s)
$stderr.puts(s)
$stderr.puts("Usage: #{File.basename($0)}: [-l <logfile] [-q] file ...")
exit(2)
end
$quiet = false
$logfile = nil
loop { case ARGV[0]
when '-q' then ARGV.shift; $quiet = true
when '-l' then ARGV.shift; $logfile = ARGV.shift
when /^-/ then usage("Unknown option: #{ARGV[0].inspect}")
else break
end; }
# Program carries on here.
puts("quiet: #{$quiet} logfile: #{$logfile.inspect} args: #{ARGV.inspect}")
Вы можете попробовать что-нибудь вроде:
if( ARGV.include( '-f' ) )
file = ARGV[ARGV.indexof( '-f' ) + 1 )]
ARGV.delete('-f')
ARGV.delete(file)
end
Я полностью понимаю, почему вы не хотите использовать optparse - его может оказаться слишком много. Но есть несколько гораздо более «легких» решений (по сравнению с OptParse), которые поставляются в виде библиотек, но достаточно просты, чтобы сделать установку одного гема стоящей.
Например, посмотрите этот пример OptiFlag . Всего несколько строк на обработку. Слегка усеченный пример для вашего случая:
require 'optiflag'
module Whatever extend OptiFlagSet
flag "f"
and_process!
end
ARGV.flags.f # => .. whatever ..
Есть тонны индивидуальных примеров . Я помню, как использовал другой, который был еще проще, но пока он ускользнул от меня, но я вернусь и добавлю здесь комментарий, если найду его.
Вы считали Тора вайкатами? Я думаю, что это намного чище, чем optparse. Если у вас уже есть сценарий, может потребоваться дополнительная работа по его форматированию или рефакторингу для Thor, но он делает параметры обработки очень простыми.
Вот пример фрагмента из README:
class MyApp < Thor # [1]
map "-L" => :list # [2]
desc "install APP_NAME", "install one of the available apps" # [3]
method_options :force => :boolean, :alias => :optional # [4]
def install(name)
user_alias = options[:alias]
if options.force?
# do something
end
# ... other code ...
end
desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
def list(search = "")
# list everything
end
end
Thor автоматически отображает команды как таковой:
app install myname --force
Это преобразуется в:
MyApp.new.install("myname")
# with {'force' => true} as options hash
Я разделяю ваше отвращение к require 'getopts'
, в основном из-за того, насколько хорош OptionParser
:
% cat temp.rb
require 'optparse'
OptionParser.new do |o|
o.on('-d') { |b| $quiet = b }
o.on('-i') { |b| $interactive = b }
o.on('-f FILENAME') { |filename| $filename = filename }
o.on('-h') { puts o; exit }
o.parse!
end
p :quiet => $quiet, :interactive => $interactive, :filename => $filename
% ruby temp.rb
{:interactive=>nil, :filename=>nil, :quiet=>nil}
% ruby temp.rb -h
Usage: temp [options]
-d
-i
-f FILENAME
-h
% ruby temp.rb -d
{:interactive=>nil, :filename=>nil, :quiet=>true}
% ruby temp.rb -i
{:interactive=>true, :filename=>nil, :quiet=>nil}
% ruby temp.rb -di
{:interactive=>true, :filename=>nil, :quiet=>true}
% ruby temp.rb -dif apelad
{:interactive=>true, :filename=>"apelad", :quiet=>true}
% ruby temp.rb -f apelad -i
{:interactive=>true, :filename=>"apelad", :quiet=>nil}
Как автор Trollop , я не могу поверить в то, что люди считают разумным в парсере опций. Шутки в сторону. Это поражает воображение.
Зачем мне нужно делать модуль, который расширяет какой-то другой модуль для анализа параметров? Зачем мне что-то подклассифицировать? Почему я должен подписываться на какую-то «структуру» только для того, чтобы разбирать командную строку?
Вот версия вышеупомянутого Trollop:
opts = Trollop::options do
opt :quiet, "Use minimal output", :short => 'q'
opt :interactive, "Be interactive"
opt :filename, "File to process", :type => String
end
И все. opts
теперь является хешем с ключами : quiet
, : interactive
и : filename
. Вы можете делать с ним все, что хотите. И вы получите красивую страницу справки, отформатированную под ширину экрана, автоматические короткие имена аргументов, проверку типов ... все, что вам нужно.
Это один файл, так что вы можете поместить его в свой каталог lib /, если вам не нужна формальная зависимость. Он имеет минимальный DSL, который легко подобрать.
LOC на опционов. Это важно.
Видимо, мы с Уильямом Морганом думаем одинаково. Я только вчера вечером выпустил на Github то, что сейчас вижу, похожее на библиотеку Trollop (Named how?) после того, как провел поиск OptionParser на Github, смотрите Switches
There's a few differences, but the philosophy is same. Одно из очевидных различий состоит в том, что Switches зависит от OptionParser.