1

私は自分のスクリプトにオプションに基づいてさまざまなことをさせようとしています。でも…ルビーなんて全然わからない。配列が実際に何であるかさえあなたに言うことができません。これが私が得たものです:

require 'optparse'
require 'pp'

# the options eventually get put here
options = {}

optparse = OptionParser.new do|opts|

# the help info
opts.banner = "Usage: script.rb [options] input-file output-file"

# This sets the default of 'flag' to 'false' and says it should be
# 'true' if the '-f' option is present
options[:flag] = false
  opts.on( '-f', '--flag', "Flag has been set" ) do
  options[:flag] = true
  end
end

optparse.parse!

# if no input-file or output-file is given, spit out the help
if ARGV.empty?
  puts optparse
  exit(-1)
end

# If the flag is true then tell me so, if not, tell me it isn't.
if options[:flag] = true
  pp "Flag is true"
else
  pp "Flag is false"
end

事前に感謝し、コーディング方法を知らずにコーディングしようとして申し訳ありません。お辞儀をします。

4

1 に答える 1

5

オプションハッシュ

optionsは配列ではなく、ハッシュです。ハッシュには、それぞれ独自の特別なキーを持つオブジェクトが格納されています。あなたの場合、キーはです:flag。そのため、を呼び出すたびにoptions[:flag]、そこに保存されているものはすべて取得されます。

options = {}

これにより、空の新しいハッシュが作成されます。

オプションパーサー

最初からそれを取りましょう:あなたのコードはで始まります

optparse = OptionParser.new do|opts|
  ...
end

のインスタンスを作成しますOptionParser。これは、オプションの解析に役立つクラスです。このnew()メソッドは実際には、特別なRubyコマンドであるブロックを取ることができます。配列が何であるかわからない場合は、Rubyブロックはかなり特殊な言語要素であるため、Rubyブロックについてもう少し読む必要があるかもしれません。

optsとにかく、それが行うことは、スクリプトに渡された引数を処理するという名前のオブジェクトを作成することです。このオブジェクトは|opts|(パイプ内で)表示され、ブロック変数です。ブロックについて読んだことがありますか?

まず、banner()メソッドを使用してバナーを印刷するのに役立ちます。後で、on()渡された引数があったかどうかをメソッドでチェックします。

optionsまた、以前の空のハッシュがあることを忘れないでください。-fこの場合、渡されたオプションを探したいので、

opts.on( '-f', '--flag', "Flag has been set" ) do

前述のように、このon()メソッドは最初のパラメーター('-f')、またはのような代替パラメーターを探します'--flag'。説明もあります。オプションが渡された場合、オプションが渡されたかどうかを記憶したいので、以下の行が実行されます。

options[:flag] = true

これで、optionsハッシュにキーが含まれ、:flagそれが正しいことがわかりました。

注: optparse.parse!実際には、すべての解析が開始されます。このOptionParserオブジェクトは以前に作成したことがありますが、それ自体ではまだ実際には何もしていません。したがって、このメソッドは。と呼ばれparse!()ます。感嘆符は、Rubyでいくつかのメソッドに使用するのが好きなものです。あなたは時々それに出くわすでしょう。とにかく、電話しないとparse!何も起こりません。これは、Rubyのオプションパーサーを構築する方法です。

オプションの確認

これで、スクリプトの最後で、optionsオプションパーサーが以前にすべてを解析したため、すべてのオプションがハッシュ内にあると想定します。キーの要素:flagがtrueに設定されているかどうかを確認してください。

if options[:flag] == true

そして出来上がり!重要==:コードを2倍忘れました!比較したいのですが、を使用すると=、何があってもキーがtrueに設定されます。==したがって、条件式には必要であり、必要ではないことを覚えておいてください=

:そこにある鍵を探すこともできたはずです。以前はハッシュが空だったため、キーがまったくありませんでした。オプション-fが解析された後、ハッシュにはキーが含まれていました:flag。したがって、明らかに唯一の値である値を探す代わりにtrue、キーを探すことができます。

if options.key?(:flag)
  # => the flag was set
end

さらにオプションを追加する

例のメソッドと同じように、on()別のメソッドを追加できます。たとえば、ハッシュに別のキーを使用することを忘れないでください:execute

opts.on( '-x', '--execute', "Do something!" ) do
  options[:execute] = true
end
于 2011-04-23T08:01:37.300 に答える