2011-04-16 70 views
6

我需要在Ruby中使用getoptlong類的幫助。我需要執行命令prog_name.ruby -u -i -s filename。到目前爲止,我只能用prog_name.ruby -u filename -i filename -s filename來執行它。如何在ruby中使用getoptlong類?

這是我的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 
+0

'begin/end while'1' block'begin/end'? o_O怎麼樣'loop'? – 2011-04-16 23:44:53

回答

10

我會通過推薦期待新十歲上下的「slop」寶石來回答。這是一個圍繞getoptlong的包裝。

如果您使用的是RVM,則可以使用gem install slop,否則使用sudo gem install slop

GetOptLong功能非常強大,但儘管我已經多次使用過它,但我仍然需要每次都閱讀文檔。

如果您想要更強大一點,使用「比GetOptLong更易於使用的界面」,請查看Ruby的OptionParser。您需要更好地解決邏輯問題,但這是通過轉換代碼的快速傳遞。我不得不爲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"
  • if ARGV[0] == nil || ARGV.size != 1是錯綜複雜的。研究ARGV和陣列如何工作。通常,對於ARGV[0]爲零,將不會有更多參數,因此ARGV.empty?可能就足夠了。
+1

optparser> getoptlong。當然。 – 2011-04-16 23:43:13

相關問題