Ruby: OptionParser:字符串参数和哈希赋值

4

使用OptionParser进行字符串参数输入和哈希分配。如何读取单个参数的多个变量?然后,我如何将它们分配给哈希以进行引用?以下是我目前的代码:

large_skus = Hash.new
small_skus = Hash.new

OptionParser.new do |opts|

opts.on("-b", "--brands bName1,bName2,bNameN", String, "Check specific brands by name") do |b|
 options[:brands] = b.split(",")
end

opts.on("-l", "--large lSku1,lSku2,lSkuN", String, "Large SKUs - List CSVs") do |l|
 options[:large_skus] = l.split(",")
 ##For each sku given
 brandName = options[:brands]
 large_skus[brandName] = l[$sku].to_i
 ##
end

opts.on("-s", "--small sSku1,sSku2,sSkuN", String, "Small SKUs - List CSVs") do |s|
 options[:small_skus] = s.split(",")
 ##For each sku given
 brandName = options[:brands]
 small_skus[brandName] = s[$sku].to_i
 ##
end

end.parse!(ARGV)
2个回答

7

如果给出以下输入:

 ruby test.rb --brands bName1,bName2,bNameN --large lSku1,lSku2,lSkuN --small wQueue1,wQueue2,wQueueN

这段代码。
#!/usr/bin/env ruby

require 'ap'
require 'optparse'

options = {}
OptionParser.new do |opts|

  opts.on("-b", "--brands bName1,bName2,bNameN", Array, "Check specific brands by name") do |b|
    options[:brands] = b
  end

  opts.on("-l", "--large lSku1,lSku2,lSkuN", Array, "Large SKUs - List CSVs") do |l|
    options[:large_skus] = l
  end

  opts.on("-s", "--small wQueue1,wQueue2,wQueueN", Array, "Small SKUs - List CSVs") do |s|
    options[:small_skus] = s
  end

end.parse!(ARGV)

ap options

生成以下输出:

{
        :brands => [
        [0] "bName1",
        [1] "bName2",
        [2] "bNameN"
    ],
    :large_skus => [
        [0] "lSku1",
        [1] "lSku2",
        [2] "lSkuN"
    ],
    :small_skus => [
        [0] "wQueue1",
        [1] "wQueue2",
        [2] "wQueueN"
    ]
}

请注意,我使用的是数组类型而不是字符串类型来表示每个选项。这样OptionParser就可以将元素解析成一个数组,让你可以自由地处理数组中的元素。


明白了,数组是一个不错的选择。那哈希赋值怎么样?我更新了原帖,发现有些拼写错误(队列 vs. 库存单位)。我的想法是,我不必通过索引号迭代小型或大型库存单位数组来查找它们匹配/关联的品牌。 - user453366
根据您的示例代码,您要做什么并不是很明显。您的代码中缺少变量($sku),而且您也没有解释large_skus和small_skus哈希表的意图。 - the Tin Man

5

我认为你的方法不太对。你希望用户跟踪他们输入参数的顺序,但你又不想在代码中跟踪。

为什么不明确规定,不要求任何人记住参数的顺序:

ruby test.rb --input bName1,lSku1,wQueue1 --input bName2,lSku2,wQueue2 --input bNameN,lSkuN,wQueueN

代码:

opts.on("--input <brand,Large_Skus,Small_Skus>", "input description",
        "NOTE: Can be used more than once.") do |opt|
  list = opt.split(',')
  unless list.lenght == 3
    raise "some error because you didn't place all arguments"
  end
  options[:input].push list
end 

结果:

[ [ 'bName1', 'lSku1', 'wQueue1' ],
  [ 'bName2', 'lSku2', 'wQueue2' ],
  [ 'bNameN', 'lSkuN', 'wQueueN' ] ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接