gpt4 book ai didi

ruby - Ruby OptionParser 如何处理带空格的参数?

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

我正在尝试为我的 Ruby 脚本定义选项,该脚本将消息从用户 A 发送到用户 B 以进行测试。但是,当某些选项的值中有空格时,我无法让它工作。例如:

    OptionParser.new do |opts|
opts.on("-p", "--params a=A,b=B,c=C", Array, "Parameters to compose the message") do |params|
options.params = params.map { |p| p.split("=") }
end
end

但是当我尝试指定诸如 -p SENDER=foo,RECIPIENT=bar,BODY=foo bar 之类的东西时,它只是给了我 ["SENDER"=> "foo", "RECIPIENT"=> "bar", "BODY"=> "foo"].

我也试过 -p SENDER=foo,RECIPIENT=bar,BODY='foo bar' 但也没成功。

OptionParser 是否支持这种情况?

谢谢!

最佳答案

使用单引号或双引号将参数括起来:

-p 'SENDER=foo,RECIPIENT=bar,BODY=foo bar'

例如:

require 'optparse'

options = {}
OptionParser.new do |opt|
opt.on('-p', '--params OPTS', Array) { |o| options[:p] = o }
end.parse!

require 'pp'
pp options # =>

在命令行使用:

ruby test.rb --params 'SENDER=foo,RECIPIENT=bar,BODY=foo bar'

输出:

{:p=>["SENDER=foo", "RECIPIENT=bar", "BODY=foo bar"]}

这不是 OptionParser 问题,而是命令行在解析选项并将它们传递给脚本时的工作方式。 OptionParse 只有在看到参数 'SENDER=foo,RECIPIENT=bar,BODY=foo bar' 时才会参与,并将其在逗号上拆分为一个数组并将其传递给 opt.on block :

'SENDER=foo,RECIPIENT=bar,BODY=foo bar'.split(',')
# => ["SENDER=foo", "RECIPIENT=bar", "BODY=foo bar"]

看起来您正试图将传入数据拆分为一个数组数组,因为:

options.params = params.map { |p| p.split("=") }

我建议考虑将其转换为散列:

opt.on('-p', '--params OPTS', Array) { |o| options[:p] = Hash[o.map{ |s| s.split('=') }] }

结果是:

{:p=>{"SENDER"=>"foo", "RECIPIENT"=>"bar", "BODY"=>"foo bar"}}

并且可以轻松获取传入的特定条目:

pp options[:p]['BODY'] # => "foo bar"

关于ruby - Ruby OptionParser 如何处理带空格的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25294985/

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