我需要有关在 Ruby 中使用 getoptlong 类的帮助。我需要执行命令 prog_name.ruby -u -i -s 文件名。到目前为止,我只能使用 prog_name.ruby -u 文件名 -i 文件名 -s 文件名来执行它。
这是我的 getoptlong 代码:
require 'getoptlong'
class CommonLog
parser = GetoptLong.new
parser.set_options(["-h", "--help", GetoptLong::NO_ARGUMENT],
["-u", "--url", GetoptLong::NO_ARGUMENT],
["-i", "--ip", GetoptLong::NO_ARGUMENT],
["-s", "--stat", GetoptLong::NO_ARGUMENT])
begin
begin
opt,arg = parser.get_option
break if not opt
case opt
when "-h" || "--help"
puts "Usage: -u filename"
puts "Usage: -i filename"
puts "Usage: -s filename"
exit
when "-u" || "--url"
log = CommonLog.new(ARGV[0])
log.urlReport
when "-i" || "--ip"
log = CommonLog.new(ARGV[0])
log.ipReport
when "-s" || "--stat"
log = CommonLog.new(ARGV[0])
log.statReport
end
rescue => err
puts "#{err.class()}: #{err.message}"
puts "Usage: -h -u -i -s filename"
exit
end
end while 1
if ARGV[0] == nil || ARGV.size != 1
puts "invalid! option and filename required"
puts "usage: -h -u -i -s filename"
end
最佳答案
我将通过推荐查看新的“slop”gem 来回答。它是 getoptlong
的包装器。
如果您使用的是 RVM,则可以使用 gem install slop
,否则可以使用 sudo gem install slop
。
GetOptLong很强大,虽然用了好几次了,每次还是要去看文档。
如果您想要更强大的功能,使用“比 GetOptLong 更易于使用的界面”,请查看 Ruby 的 OptionParser
.您需要更好地制定逻辑,但这是转换代码的快速 channel 。我不得不为 CommonLog gem 创建一个类,因为我不使用它。重要的内容遵循从 ARGV
中提取日志的行:
require 'optparse'
class CommonLog
def initialize(*args); end
def urlReport(); puts "running urlReport()"; end
def ipReport(); puts "running ipReport()"; end
def statReport(arg); puts "running statReport(#{arg})"; end
end
log = CommonLog.new(ARGV[0])
OptionParser.new { |opts|
opts.banner = "Usage: #{File.basename($0)} -u -i -s filename"
opts.on( '-u', '--[no-]url', 'some short text describing URL') do
log.urlReport()
end
opts.on('-i', '--[no-]ip', 'some short text describing IP') do
log.ipReport()
end
opts.on('-s', '--stat FILENAME', 'some short text describing STAT') do |arg|
log.statReport(arg)
end
}.parse!
此外,作为快速批评,您没有编写惯用的 Ruby 代码:
when
语句可以这样写:when "-h", "--help"
如果 ARGV[0] == nil || ARGV.size != 1
很复杂。研究 ARGV 和阵列的工作原理。通常,如果ARGV[0]
为 nil,则不会有更多参数,因此ARGV.empty?
可能就足够了。
关于ruby - 如何在 ruby 中使用 getoptlong 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688685/