OptParser не возвращает параметры

У меня есть этот пример кода:

#!/usr/bin/env ruby
require_relative File.expand_path('../../lib/argosnap', __FILE__)
require 'optparse'

options = {}

opt_parser = OptionParser.new do |opt|
  opt.banner = "argosnap #{Argosnap::VERSION} ( http://github/atmosx/argosnap )\nUsage: argosnap [OPTIONS]"
  opt.separator  ""
  opt.separator  "     version: dislay version"
  opt.separator  "     install: installs 'config.yml' and launchd script"
  opt.separator  "     balance: check picodollars"
  opt.separator  ""

  opt.on("-v","--version","display version") do |version|
    options[:version] = version
  end

  opt.on("-c","--config [TYPE]", String, "install configuration files") do |config|
    options[:config] = config
  end

  opt.on("-b","--balance","executes 'argosnap' and displayes notifications") do |balance|
    options[:balance] = balance
  end

  opt.on("-h","--help","help") do
    puts opt_parser
  end
end

begin
  opt_parser.parse!
rescue OptionParser::InvalidOption => e
  puts "No such option! Type 'argosnap -h' for help!"
  exit
end

case ARGV[0]
when "version"
  puts Argosnap::VERSION
when "config"
  Argosnap::Install.new.config
when "balance"
  b = Argosnap::Fetch.new.balance
  puts "Current balance (picodollars): #{b}"
else
  puts "Type: 'argosnap -h' for help!"
end

Моя проблема в том что options хеш пуст Это как если он не принимает options[:var] = var определенный внутри класса OptParser. Я хотел бы использовать -v а также --version в моей программе, чтобы сделать его более Unix-подобным.

я использую ruby-2.0,

ОБНОВЛЕНИЕ: как это код works Я пытался изменить when "version" с when '-v' или же when options[:version] который казался мне лучшим подходом, но ничего не получалось.

1 ответ

Решение

Когда ты пишешь дело ARGV[0] вы полностью игнорируете opt_parser...
ARGV[0] это первое слово в командной строке. Весь смысл opt_parser в том, что вы не смотрите на ARGV:

if options[:version]
  puts Argosnap::VERSION
elsif options[:config]
  Argosnap::Install.new.config
elsif options[:balance]
  b = Argosnap::Fetch.new.balance
  puts "Current balance (picodollars): #{b}"
else
  puts "Type: 'argosnap -h' for help!"
end
Другие вопросы по тегам