2

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

本质上,我想撤消此操作(无需删除代码行,因为它是第 3 方):

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

我尝试查看类的代码,但没有找到任何remove机制。所以我想在通过元编程破解它之前我会问一下。

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

class OptionParser
  attr_accessor :stack
end

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

2 回答 2

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" }
于 2013-08-25T23:01:36.020 回答
1

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

于 2013-12-07T18:06:33.370 回答