我试图使用Ruby内置选项解析器
我有这个文件
File parser.rb #!/ usr / bin / env ruby 要求'optparse' 要求'pp'
class parser
def initialize(args)
@options = Hash.new()
@op = OptionParser.new do |opts|
@options[:verbose] = false
opts.on('-v', '--verbose', 'Output more information') do
@options[:verbose] = true
end
@options[:quick] = false
opts.on( '-q', '--quick', 'Perform the task quickly' ) do
@options[:quick] = true
end
@options[:logfile] = nil
opts.on( '-l', '--logfile FILE', 'Write log to FILE' ) do|file|
@options[:logfile] = file
end
opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
@options[:sID] = "-1"
opts.on('-sID', '--senderID', 'Sender ID used by device') do |sID|
@options[:sID] = sID
end
@options[:rID] = "-1"
opts.on('-rID', '--receiverID', 'Receiver ID used by device') do |rID|
@options[:rID] = rID
end
@op.parse!
@op
end
def getOptionsHash
@options
end
然后我试图在下面的文件中使用这个类
#!/usr/bin/env ruby
# Setup Bundler
require 'rubygems'
require 'bundler/setup'
require_relative 'parser'
#Variables in the options hash in parser.rb
op = Parser.new(ARGV)
pp op.getOptionsHash()
当我在没有args的命令行上运行它时,它使用默认值: ./push_test.rb
我得到以下输出:
{:verbose=>false,
:quick=>false,
:logfile=>nil,
:sID=>"-1",
:rID=>"-1",
}
当我在args的命令行上运行它时: ./push_test.rb -sID“33”
我得到以下输出:
{:verbose=>false,
:quick=>false,
:logfile=>nil,
:sID=>"ID",
:rID=>"-1",
}
为什么sID没有设置为33?
任何人都可以帮忙吗?我试图解决这个问题,但不能取得任何进展
答案 0 :(得分:1)
似乎短开关必须是单个字符-s
./push_test.rb -sID "33"
输出:
{:verbose=>false, :quick=>false, :logfile=>nil, :sID=>"ID", :rID=>"-1" }
因为-s到第一个空白区域后的所有内容都将分配给:sID,在您的情况下,“-s”后面的单词“ID”,因此您将获得:sID =>"ID"
./push_test.rb -s "33"
可以解决问题。
答案 1 :(得分:0)
来自OptParser docs:
Short style switch:: Specifies short style switch which takes a mandatory, optional or no argument. It's a string of the following form: "-xMANDATORY" "-x[OPTIONAL]" "-x"
因此,在指定switch -sID
时,您可以使用名为-s
的参数定义switch ID
- 这与您可能期望的不同。