Ruby 帮我为我的小脚本准备一些选项

Ruby 帮我为我的小脚本准备一些选项,ruby,optparse,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 ou

我试图让我的脚本根据选项做不同的事情。但是我一点也不认识鲁比。我甚至不能告诉你数组到底是什么。以下是我得到的:

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
提前感谢,很抱歉在不知道如何编码的情况下尝试编码。我向你鞠躬,哦,太棒了。

选项散列
options
不是数组,而是数组。在散列中,存储了一些对象,每个对象都有自己的特殊密钥。在您的情况下,键是
:flag
,因此无论何时调用
选项[:flag]
,您都将获得存储在那里的内容

options = {}
这只会创建一个空的新哈希

选项解析器 让我们从头开始:您的代码从

optparse = OptionParser.new do|opts|
  ...
end
您可以创建一个
OptionParser
的实例。这是一个帮助您解析选项的类。
new()
方法实际上可以接受一个块,这是一个特殊的Ruby命令。如果您不知道数组是什么,您可能需要了解Ruby块,因为它是一种非常特殊的语言元素

无论如何,它所做的是创建一个名为
opts
的对象,该对象将处理传递给脚本的参数。您可以在
| opts |
(管道内)中看到此对象,它是块变量--您现在已经阅读了关于块的内容,是吗

首先,它有助于使用
banner()
方法打印横幅。稍后,它将使用
on()
方法检查是否传递了参数

另外,请记住,您现在有了以前的空
选项
散列。在本例中,我们希望查找传递的
-f
选项,因此调用

opts.on( '-f', '--flag', "Flag has been set" ) do
如前所述,
on()
方法查找其第一个参数(
'-f'
),或类似于
'--flag'
的替代参数。它也有一个描述。如果通过了该选项,将执行下面的行,因为我们希望记住该选项是否通过:

options[:flag] = true
现在,您的
选项
哈希包含键
:flag
,我们知道这是真的

注意:
optpasse.parse实际上只是开始所有的解析。请记住,我们以前创建过这个Option Parser对象,但它本身并没有做任何事情。因此,它有一个名为
parse!()
。感叹号是人们喜欢在Ruby中用于某些方法的符号。你有时会感到沮丧。无论如何,如果你不调用
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
选项散列
options
不是数组,而是数组。在散列中,存储了一些对象,每个对象都有自己的特殊密钥。在您的情况下,键是
:flag
,因此无论何时调用
选项[:flag]
,您都将获得存储在那里的内容

options = {}
这只会创建一个空的新哈希

选项解析器 让我们从头开始:您的代码从

optparse = OptionParser.new do|opts|
  ...
end
您可以创建一个
OptionParser
的实例。这是一个帮助您解析选项的类。
new()
方法实际上可以接受一个块,这是一个特殊的Ruby命令。如果您不知道数组是什么,您可能需要了解Ruby块,因为它是一种非常特殊的语言元素

无论如何,它所做的是创建一个名为
opts
的对象,该对象将处理传递给脚本的参数。您可以在
| opts |
(管道内)中看到此对象,它是块变量--您现在已经阅读了关于块的内容,是吗

首先,它有助于使用
banner()
方法打印横幅。稍后,它将使用
on()
方法检查是否传递了参数

另外,请记住,您现在有了以前的空
选项
散列。在本例中,我们希望查找传递的
-f
选项,因此调用

opts.on( '-f', '--flag', "Flag has been set" ) do
如前所述,
on()
方法查找其第一个参数(
'-f'
),或类似于
'--flag'
的替代参数。它也有一个描述。如果通过了该选项,将执行下面的行,因为我们希望记住该选项是否通过:

options[:flag] = true
现在,您的
选项
哈希包含键
:flag
,我们知道这是真的

注意:
optpasse.parse实际上只是开始所有的解析。请记住,我们以前创建过这个Option Parser对象,但它本身并没有做任何事情。因此,它有一个名为
parse!()
。感叹号是人们喜欢在Ruby中用于某些方法的符号。你有时会感到沮丧。无论如何,如果你不调用
parse,不会发生任何事情。这就是Ruby选项解析器的构建方式

检查选项 现在,在脚本末尾,您将假定所有选项都在
选项中