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

1 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
Run Code Online (Sandbox Code Playgroud)

在此先感谢,并且抱歉在不知道如何编码的情况下尝试编码.我向你们低头哦.

slh*_*hck 5

选项哈希

options不是数组,它是哈希.在哈希中,存储了对象,每个对象都有自己的特殊键.在你的情况下,关键是:flag,所以每当你打电话options[:flag],你将获得存储在那里的任何东西.

options = {}
Run Code Online (Sandbox Code Playgroud)

这只是创建一个空的新哈希.

选项解析器

让我们从头开始:你的代码从...开始

optparse = OptionParser.new do|opts|
  ...
end
Run Code Online (Sandbox Code Playgroud)

您创建一个实例OptionParser.这是一个帮助您解析选项的类.该new()方法实际上可以采用一个块,这是一个特殊的Ruby命令.如果您不知道Array是什么,您可能需要阅读更多关于Ruby块的内容,因为它是一个相当特殊的语言元素.

无论如何,它的作用是创建一个名为的对象opts,它将处理传递给脚本的参数.你可以在|opts|(在管道内)看到这个对象,它是块变量 - 你现在已经读过块了,对吗?

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

此外,请记住,您现在拥有以前的空optionsHash.在这种情况下,我们想要查找-f传递的选项,因此我们调用

opts.on( '-f', '--flag', "Flag has been set" ) do
Run Code Online (Sandbox Code Playgroud)

如前所述,该on()方法会查找其第一个参数('-f')或其他类似参数'--flag'.它也有描述.如果选项已通过,则将执行下面的行,因为我们想要记住是否传递了该选项:

options[:flag] = true
Run Code Online (Sandbox Code Playgroud)

现在,您的options哈希包含密钥:flag,我们知道它是真的.

注意: optparse.parse!实际上只是启动所有解析.请记住,我们之前已经创建了这个Option Parser对象,但它本身并没有真正做任何事情.因此,它有这个方法叫做parse!().感叹号是人们喜欢在Ruby中用于某些方法的东西.你有时会碰到它.无论如何,如果你不打电话parse!,什么都不会发生.这就是Ruby的选项解析器的构建方式.

检查选项

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

if options[:flag] == true
Run Code Online (Sandbox Code Playgroud)

瞧!重要提示:您==在代码中忘记了双倍!你想做一个比较和使用=将密钥设置为真,无论如何.所以请记住你需要的条件表达式==而不是=!

注意:我们也可以找到关键.由于哈希之前是空的,它根本没有任何密钥.-f解析选项后,哈希包含密钥:flag.因此true,我们可以只查找关键字,而不是寻找显然只能看到的值:

if options.key?(:flag)
  # => the flag was set
end
Run Code Online (Sandbox Code Playgroud)

添加更多选项

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

opts.on( '-x', '--execute', "Do something!" ) do
  options[:execute] = true
end
Run Code Online (Sandbox Code Playgroud)