gpt4 book ai didi

ruby - 帮助我为我的小脚本准备好选项

转载 作者:太空宇宙 更新时间:2023-11-03 17:40:18 24 4
gpt4 key购买 nike

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

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 不是数组,它是 Hash .在散列中,存储了对象,每个对象都有自己的特殊键。在您的情况下, key 是 :flag,因此无论何时调用 options[:flag],您都将获得存储在那里的任何内容。

options = {}

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

选项解析器

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

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

您创建一个 OptionParser 的实例。这是一个可以帮助您解析选项的类。 new() 方法实际上可以取一个 block ,这是一个特殊的 Ruby 命令。如果你不知道数组是什么,你可能需要 read a bit more关于 Ruby block ,因为它是一种相当特殊的语言元素。

无论如何,它所做的是创建一个名为 opts 的对象,它将处理传递给脚本的参数。您可以在 |opts|(在管道内)中看到这个对象,它是 block 变量——您现在已经了解了 block ,对吗?

首先,它有助于使用 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。所以请记住,对于条件表达式,您需要 == 而不是 =!

注意:我们也可以只是寻找那里的 key 。由于哈希之前是空的,所以它根本没有任何 key 。解析选项 -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

关于ruby - 帮助我为我的小脚本准备好选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5762979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com