我正在尝试让我的脚本根据选项执行不同的操作。但是......我根本不认识红宝石。我甚至不能告诉你阵列到底是什么。这就是我得到的:
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
提前致谢,很抱歉在不知道如何编码的情况下尝试编码。我向你们低头哦。伟大的。
答案 0 :(得分:5)
options
不是数组,而是Hash。在哈希中,存储了对象,每个对象都有自己的特殊键。在您的情况下,密钥为:flag
,因此无论何时拨打options[:flag]
,您都可以获得存储在那里的内容。
options = {}
这只会创建一个空的新哈希。
让我们从头开始:你的代码从
开始optparse = OptionParser.new do|opts|
...
end
您创建OptionParser
的实例。这是一个帮助您解析选项的类。 new()
方法实际上可以采用一个块,这是一个特殊的Ruby命令。如果你不知道数组是什么,你可能需要read a bit more关于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!
实际上只是启动所有解析。请记住,我们之前已经创建了这个Option Parser对象,但它本身并没有真正做任何事情。因此,它有一个名为parse!()
的方法。感叹号是人们喜欢在Ruby中用于某些方法的东西。你有时会come across it。无论如何,如果你不打电话parse!
,什么都不会发生。这就是构建Ruby的选项解析器的方式。
现在在脚本结束时,您将假设所有选项都在options
哈希中,因为选项解析器之前解析了所有内容。只需查看键:flag
处的元素是否已设置为true:
if options[:flag] == true
瞧! 重要:您在代码中忘记了双==
!您想进行比较,使用=
无论如何都会将密钥设置为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