ruby - Ruby 的 OptionParser 是如何工作的?

标签 ruby optionparser

来自 http://ruby-doc.org/stdlib-2.1.5/libdoc/optparse/rdoc/OptionParser.html 的 OptionParser 的“最小示例” :

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
    options[:verbose] = v
  end
end.parse!

p options
p ARGV

主要问题:

  • opts 的内容到底是什么?它是新的 OptionParser 实例,还是传递给脚本的所有 /-\w//--\w+/ 外观的东西?作为推论,do 是否会阻塞循环?
  • parse! 做什么?为什么在整个 do block 中调用它?

还想知道:

  • OptionParser#banner 方法是什么?您会在什么情况下看到该文本?
  • 在那个例子中,您会在什么情况下看到传递给 OptionParser 的第三个参数,即对标志效果的简短描述?
  • 如果脚本以未知选项运行,您如何创建自定义错误消息?

最佳答案

  1. opts 只是 OptionParser 的新实例。提供给 .new 的 block 使用以下行运行:

    yield self if block_given?
    
  2. parse!parse 相同,但它是破坏性的,这意味着它将从 中删除使用过的开关>ARGV。它在整个 do ... end block 上被调用,因为返回的值是新的 OptionParser 实例。

  3. banner 获取摘要的标题,可通过opts.banner = "foo"

  4. 设置
  5. 显示帮助时显示说明(-h标志):

    Usage: example.rb [options]
        -v, --[no-]verbose               Run verbosely
    
  6. 您可以挽救 OptionParser::InvalidOption 异常:

    parser = OptionParser.new ...
    
    begin
      parser.parse!
    rescue OptionParser::InvalidOption
      puts 'Invalid args!'
    end           
    

关于ruby - Ruby 的 OptionParser 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238536/

相关文章:

ruby - ActiveAdmin、CanCan、Rolify - 无法有条件地禁用过滤器

mysql - Rails 脚手架方法的最佳实践

ruby - optionparser 将数组传递给 ruby​​ 文件

c++ - boost::program_options 具有多个标记的配置文件选项

ruby-on-rails - 如何使用 Factory girl 创建管理员角色?

ruby-on-rails - Rails 部署,每个客户端一个环境是正确的方法吗?

ruby - 来自 Windows 的 Capistrano 和 Pageant

ruby - 没有参数的 OptionParse 显示横幅

Ruby:OptionParser:字符串参数和哈希分配

ruby - 如何在 ruby​​ 的 OptionParser 中使用变量参数