删除命令行开关

时间:2013-08-09 09:50:46

标签: ruby optparse

我使用一个定义了自己的开关的库,然后传递OptionParser对象让我添加地雷。 然而,它添加了我想删除的开关,因为它们会让我的用户感到困惑。

从本质上讲,我想撤消这一点(不需要删除代码行,因为它是第三方):

opts.on("-p", "--port PORT", Integer, "Specify port", "(default: #{options[:port]})") do |v|
  options[:port] = v
end

我尝试查看类的代码,但没有找到任何remove机制。 所以我想在通过元编程进行黑客攻击之前我会问。

编辑 - 元编程方式(vey hacky ..):

class OptionParser
  attr_accessor :stack
end

...
  opts.stack[2].long.reject! { |k| k == "port" }
  opts.stack[2].short.reject! { |k| k == "p" }
...

2 个答案:

答案 0 :(得分:1)

虽然仍然不是最优雅的解决方案,但您可以避免使用instance_variable_get方法重新打开该类。在这种情况下,您的代码将变为:

opts.instace_variable_get(:@stack)[2].long.reject! { |k| k == "port" }
opts.instace_variable_get(:@stack)[2].short.reject! { |k| k == "p" }

答案 1 :(得分:1)

我也想为同样的问题找到解决方案并为它制作一个宝石:https://github.com/KitaitiMakoto/optparse-off