ruby - 如何在 ruby​​ 中使用 getoptlong 类?

标签 ruby getopt-long

我需要有关在 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/

相关文章:

ruby-on-rails - 如何在一些数据之后进行迭代?

ruby-on-rails - ActiveRecord 序列化问题

c - getopt_long 问题

ruby-on-rails - Rails 在 erb 标签中嵌入 html 标签?

Ruby 以编程方式调用方法,参数数量可变

ruby-on-rails - 如何更改覆盖 'to_json' 方法的值?

java gnu getopt - 如何使其不区分大小写?

perl - 向脚本添加帮助命令

c - getopt_long : only modify flag if user supplied command-line option