gpt4 book ai didi

ruby - 如何处理 Ruby OptionParser 中缺少的强制参数?

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:45 26 4
gpt4 key购买 nike

在 OptionParser 中,我可以强制选择一个选项,但如果我省略该值,它将采用任何后续选项的名称作为值,从而搞砸其余的命令行解析。这是一个与选项值相呼应的测试用例:

$ ./test_case.rb --input foo --output bar
output bar
input foo

现在省略第一个选项的值:

$ ./test_case.rb --input  --output bar
input --output

有什么方法可以防止它以另一个选项名称作为值吗?谢谢!

这是测试用例代码:

#!/usr/bin/env ruby
require 'optparse'
files = Hash.new

option_parser = OptionParser.new do |opts|
opts.on('-i', '--input FILENAME', 'Input filename - required') do |filename|
files[:input] = filename
end
opts.on('-o', '--output FILENAME', 'Output filename - required') do |filename|
files[:output] = filename
end
end

begin
option_parser.parse!(ARGV)
rescue OptionParser::ParseError
$stderr.print "Error: " + $! + "\n"
exit
end

files.keys.each do |key|
print "#{key} #{files[key]}\n"
end

最佳答案

你想做的不是一个好主意。如果你真的有一个名为“--output”的文件怎么办?这是 Unix 上完全有效的文件名。每个 Unix 程序的选项解析都按照 ruby​​ 程序的方式工作,所以你不应该改变它,因为那样的话你的程序将与其他程序任意不同,这会造成混淆并违反“最小意外原则”。

真正的问题是:您一开始为什么会遇到这个问题?也许您正在从另一个程序运行您的程序,并且父程序提供一个空白文件名作为 --input 的参数,这使得它会将 --output 视为 --input 的参数。您可以通过始终引用您在命令行中传递的文件名来解决此问题:

./test_case.rb --input "" --output "bar"

那么 --input 会是空白的,这很容易检测到。

另请注意,如果 --input 设置为 --output(并且 --output 不是真实文件),您可以尝试打开 --input 文件。如果失败,打印如下消息:

can't open input file: --output: file not found

这应该让用户清楚他们做错了什么。

关于ruby - 如何处理 Ruby OptionParser 中缺少的强制参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547201/

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