尝试通过命令行选项从文件中打印行时出现此错误
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
答案 0 :(得分:1)
看起来你正试图在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!
在命令行中使用标记时,实际上是将变量设置为true
或false
。例如,默认情况下,对于大多数操作(例如-v
),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
是脚本的所有命令行参数的数组(在标志之后)。如果只包含一个参数,则需要第一个元素或索引0(ARGV[0]
)。所有参数都用空格分隔。因此,如果您为options[:host_file]
实施相同的技术,则可以使用ARGV[1]
。