2

独自のスイッチを定義するライブラリを使用し、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" }
...
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 に答える