1

我试图让我的脚本根据选项做不同的事情。但是...我根本不知道红宝石。我什至不能告诉你数组到底是什么。这是我得到的:

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

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

4

1 回答 1

5

选项哈希

options不是 Array ,而是Hash。在散列中,存储了对象,每个对象都有自己的特殊键。在您的情况下,关键是:flag, 这样无论何时您调用options[:flag],您都会得到那里存储的任何内容。

options = {}

这只会创建一个空的新哈希。

选项解析器

让我们从头开始:您的代码从

optparse = OptionParser.new do|opts|
  ...
end

您创建一个OptionParser. 这是一个可以帮助您解析选项的类。该new()方法实际上可以接受一个块,这是一个特殊的 Ruby 命令。如果您不知道数组是什么,您可能需要阅读更多关于 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 中用于某些方法的东西。你有时会遇到它。无论如何,如果你不打电话parse!,什么都不会发生。这正是 Ruby 的选项解析器的构建方式。

检查选项

现在在脚本结束时,您将假设所有选项都在options散列中,因为选项解析器之前解析了所有内容。只需查看键处的元素:flag是否已设置为 true:

if options[:flag] == true

瞧!重要提示:您忘记了==代码中的 double !您想进行比较,无论如何使用=都会将键设置为true。所以请记住,对于条件表达式,你需要==而不是=

注意:我们也可以只寻找那里的钥匙。由于哈希之前是空的,它根本没有任何密钥。-f解析选项后,哈希包含 key :flag。因此,与其寻找显然只能是 的值,不如true寻找键:

if options.key?(:flag)
  # => the flag was set
end

添加更多选项

就像on()您示例中的方法一样,您可以添加另一个方法。只需记住为您的哈希取另一个密钥,例如:execute.

opts.on( '-x', '--execute', "Do something!" ) do
  options[:execute] = true
end
于 2011-04-23T08:01:37.300 回答