2

コマンドライン オプションを使用してファイルから行を印刷しようとすると、このエラーが発生します

no implicit conversion of true into String (TypeError)
from threat_detection.rb:64:in 'new'
from threat_detection.rb:64:in '<main>'

代わりにファイル名を使用するとoptions[:config_file]、期待どおりにファイルの行が出力されます。

if options[:config_file]
  File.new(options[:config_file], 'r').each { |params| puts params }
end

if options[:host_file]
  File.new(options[:host_file], 'r').each { |host| puts host }
end
4

1 に答える 1

1

OptionParserRubyでクラスを使用しようとしているようです。これはコア ライブラリの一部ではないため、プログラムの先頭に次を含めるようにしてください。

require 'optparse'

さらに、オプションを正しく作成していることを確認してください。

options = {}

optparse = OptionParser.new do |opts|
  options[:config_file] = nil
  opts.on('-f', '--config-file', 'Enter the config file to open.') do
    options[:dry_run] = true
  end
end

optparse.parse!

コマンドラインでフラグを使用する場合、基本的に変数をtrueまたはに設定していますfalse。たとえば、デフォルトでは、-v(verbose) はfalseほとんどの操作 ( などrm) に対して に設定されています。コマンドとそのオプションのフラグに続くのは、(場合によっては必要な)コマンドライン引数です。これは、この場合のファイル名です。

スクリプトの呼び出しは次のようになります

$ ruby ./my_program.rb --config-file /path/to/some/file
       ^               ^             ^
       program         flag          argument

ご覧のとおり、optparse オプションはブール値でなければなりません。フラグが存在する場合にのみファイルを開きたい (オプションが true)。プログラムを実行するには、わずかな変更が必要です。

if options[:config_file]
  File.new(ARGV[0], 'r').each { |params| puts params }
end

ARGVスクリプトへのすべてのコマンドライン引数の配列です (フラグに続きます)。引数を 1 つだけ含める場合は、最初の要素、つまりインデックス 0 ( ARGV[0]) が必要になります。すべての引数はスペースで区切ります。したがって、同じ手法を に実装するとoptions[:host_file]、 を使用できますARGV[1]

于 2015-10-16T20:48:14.007 に答える