2014-02-15 101 views
1

如果我使用的文件名,而不是options[:config_file]它打印文件的線條,符合市場預期,我通過命令行選項從文件試圖打印線如何使用OptionParser通過命令行選項打開文件?

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

時收到此錯誤。

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 
+3

我懷疑'options [:config_file]'不會返回文件的名字,而是'true'的值(可能只是一個標誌選項被傳遞給腳本)。您需要使用正確的哈希/值來保存文件名或修復選項解析器代碼中的可能錯誤。 –

+1

請提供選項解析代碼... –

回答

0

看起來您正嘗試在Ruby中使用OptionParser類。由於它不是核心庫的一部分,請確保包含在程序的頂部以下內容:

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! 

在命令行中使用標誌時,基本上將變量設置爲truefalse。例如,對於大多數操作(如rm),默認情況下,-v(詳細)設置爲false。在命令及其可選標誌之後是(有時是必需的)命令行參數,這是你的情況下的文件名。

調用你的腳本應該類似於

$ 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是所有的命令行參數數組腳本(以下標誌)。如果只包含一個參數,則需要第一個元素或索引0(ARGV[0])。所有參數都用空格分隔。因此,如果您爲options[:host_file]實施相同的技術,則可以使用ARGV[1]

相關問題