2

我发现自己经常这样做:

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

如果我可以指定DirorPathname而不是String. 有没有一种模式或我的 Ruby 风格的方式来做到这一点?

4

2 回答 2

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|
于 2010-09-14T21:38:04.913 回答
0

如果您正在寻找一种 Ruby 风格的方法,我建议您尝试一下Trollop

从 1.1o 版本开始,您可以使用:io接受文件名、URI 或字符串stdin-.

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}" }

如果您需要路径名,那么它不是您要查找的内容。但是,如果您正在寻找读取文件,那么它是一种强大的抽象方法。

于 2010-09-14T20:48:56.390 回答