サーチ…


前書き

OptionParserは、 ARGVからのコマンドラインオプションの解析に使用できます。

必須およびオプションのコマンドラインオプション

あまりにも複雑すぎるものを探しているのでなければ、コマンドラインを手で解析するのは比較的簡単です:

# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2

# First item (site) is mandatory
site = ARGV.shift

ARGV.each do | id |
  # Do something interesting with each of the ids
end

しかし、オプションが複雑になり始めると、 OptionParserなどのオプションパーサーを使用する必要があります。

require 'optparse'

# The actual options will be stored in this hash
options = {}

# Set up the options you are looking for
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} -s NAME id ..."

  opts.on("-s", "--site NAME", "Site name") do |s|
    options[:site] = s
  end

  opts.on( '-h', '--help', 'Display this screen' ) do
    puts opts
    exit
  end
end

# The parse! method also removes any options it finds from ARGV.
optparse.parse!

また、非破壊parseもありますが、 ARGVの残りの部分を使用する予定がある場合はあまり役に立ちません。

OptionParserクラスには必須の引数(この場合は--siteなど)を強制する方法はありません。しかし、あなたはパーズを実行した後であなた自身のチェックをすることができますparse!

# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
  abort(optparse.help)
end

より一般的な必須オプションハンドラについては、 この回答を参照してください。明確でない場合は、必須でないように外出しない限り、すべてのオプションはオプションです。

デフォルト値

OptionsParserでは、デフォルト値を設定するのが簡単です。オプションを保存するハッシュをあらかじめ入力しておくだけです:

options = {
  :directory => ENV['HOME']
}

パーサーを定義すると、ユーザーが値を指定した場合、デフォルト値が上書きされます。

OptionParser.new do |opts|
  opts.on("-d", "--directory HOME", "Directory to use") do |d|
    options[:directory] = d
  end
end

長い説明

場合によっては説明がかなり長くなることがあります。たとえば、 irb -hは次の引数をリストします。

  --context-mode n  Set n[0-3] to method to create Binding Object,
                    when new workspace was created

これをサポートする方法はすぐには分かりません。ほとんどのソリューションでは、2行目以降のインデントを1行目に合わせるために調整が必要です。幸運にも、 onメソッドは、複数の記述行を別々の引数として追加することでサポートしています。

  opts.on("--context-mode n",
          "Set n[0-3] to method to create Binding Object,",
          "when new workspace was created") do |n|
    optons[:context_mode] = n
  end

オプションの説明行を追加して、オプションを完全に説明することができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow