抱歉标题听起来很乱,不知道如何用简洁的方式表达这个...
我希望使用如下所示的字典创建用于各种测试目的的通用 Vagrantfile。
BOXES = {
'bo': ['zesty-lxc', 4],
'sw': ['zesty-lxc', 4],
'db': ['centos-lxc', 4]
}
这会给我一个如下列表:
[
["bo1", "zesty-lxc"],
["bo2", "zesty-lxc"],
["bo3", "zesty-lxc"],
["bo4", "zesty-lxc"],
["sw1", "zesty-lxc"],
["sw2", "zesty-lxc"],
["sw3", "zesty-lxc"],
["sw4", "zesty-lxc"],
["db1", "centos-lxc"],
["db2", "centos-lxc"],
["db3", "centos-lxc"],
["db4", "centos-lxc"]
]
然后我可以在以后迭代以创建机器。
Vagrant.configure('2') do |config|
box_list.each do |box, name|
config.vm.define name do |subconfig|
subconfig.vm.box = box
subconfig.vm.hostname = name
end
end
end
我在处理这个问题时遇到了一些麻烦。我已经设法使用这个非常困惑的结构准确地打印出我想要的内容:
BOXES.map{|key, v| ([key]*BOXES[key][1]).each.with_index(1) {|machine, count| puts "#{machine}#{count} #{BOXES[key][0]}" }}
但它只打印,我不知道如何让它返回我打算稍后使用的列表。
任何帮助将不胜感激,我是 ruby 的新手,只是在我开始使用 vagrant 时才开始使用它。
最佳答案
你可以这样做:
# We will assume this is what you meant for BOXES
BOXES = {
bo: ['zesty-lxc', 4],
sw: ['zesty-lxc', 4],
db: ['centos-lxc', 4]
}
BOXES.map do |key,value|
os, number = value # assign value[0] to os and value[1] to number
number.times.map {|n| [key.to_s + (n + 1).to_s, os] }
end.flatten(1) # flatten the Array 1 level
#=> [
# ["bo1", "zesty-lxc"],
# ["bo2", "zesty-lxc"],
# ["bo3", "zesty-lxc"],
# ["bo4", "zesty-lxc"],
# ["sw1", "zesty-lxc"],
# ["sw2", "zesty-lxc"],
# ["sw3", "zesty-lxc"],
# ["sw4", "zesty-lxc"],
# ["db1", "centos-lxc"],
# ["db2", "centos-lxc"],
# ["db3", "centos-lxc"],
# ["db4", "centos-lxc"]
# ]
步骤:
BOXES#map
将创建一个新的Array
并将每个键和值生成到 block 中os, number = value
会将 value[0] 分配给os
并将 value[1] 分配给number
number.times.map
将创建一个新的Array
并循环遍历number
次传入每个整数(n
), 从0
开始循环[key.to_s + (n + 1).to_s, os]
将创建一个文字Array
,其中 [0] = key 和 number + 1 组合为字符串和 [1] = 值flatten(1)
将移除由number.times.map
创建的
Array
嵌套
关于ruby - 使用字典条目枚举 ruby 字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46161919/