2010-09-14 69 views
2

目錄或文件,我發現我自己這樣做往往:如何處理使用OptionParser

optparse = OptionParser.new do |opts| 
    options[:directory] = "/tmp/" 
    opts.on('-d','--dir DIR', String, 'Directory to put the output in.') do |x| 
    raise "No such directory" unless File.directory?(x) 
    options[:directory] = x 
    end 
end 

這將是更好,如果我可以指定DirPathname代替String。有沒有一種模式或我的Ruby風格的方式來做到這一點?

回答

5

您可以配置OptionParser接受(例如)一個路徑

require 'optparse' 
require 'pathname' 

OptionParser.accept(Pathname) do |pn| 
    begin 
    Pathname.new(pn) if pn 
    # code to verify existence 
    rescue ArgumentError 
    raise OptionParser::InvalidArgument, s 
    end 
end 

然後你就可以更改您的代碼

opts.on('-d','--dir DIR',Pathname, 'Directory to put the output in.') do |x| 
+0

謝謝!這不僅回答了我的問題,而且給出瞭如何擴展optparse接受更多事情的一個很好的例子! – 2010-09-18 00:54:11

0

如果您正在尋找Ruby風格的做法,我會建議您嘗試Trollop

從版本1.1o開始,您可以使用接受文件名,URI或字符串stdin-:io類型。

require 'trollop' 
opts = Trollop::options do 
    opt :source, "Source file (or URI) to print", 
     :type => :io, 
     :required => true 
end 
opts[:source].each { |l| puts "> #{l.chomp}" } 

如果您需要路徑名,那麼它不是你正在尋找的。但是如果你正在閱讀文件,那麼它是一個抽象它的強大方法。

+0

我不知道trollop。整齊!我一直在尋找optparse的具體答案,但我會在未來看看。 :-) – 2010-09-18 00:55:17