帮助我为我的小脚本提供实地选择

时间:2011-04-23 07:46:18

标签: ruby optparse

我正在尝试让我的脚本根据选项执行不同的操作。但是......我根本不认识红宝石。我甚至不能告诉你阵列到底是什么。这就是我得到的:

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

提前致谢,很抱歉在不知道如何编码的情况下尝试编码。我向你们低头哦。伟大的。

1 个答案:

答案 0 :(得分:5)

选项Hash

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