ruby - 使用字典条目枚举 ruby​​ 字典键

标签 ruby vagrant

抱歉标题听起来很乱,不知道如何用简洁的方式表达这个...

我希望使用如下所示的字典创建用于各种测试目的的通用 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/

相关文章:

ruby - 为什么某些 Ruby 代码在 2.53GHz 上的运行速度是在 2.2GHz Core 2 Duo 处理器上的两倍?

html - ruby on rails - 部分 CSS

vagrant - Homestead Vagrant 无法启动虚拟机 : "The VMMR0.r0 module version does not match VBoxVMM.dll/so/dylib"

vmware - 有没有办法修复 Vagrant 使用的提供程序?

synchronization - Vagrant 中的符号链接(symbolic link)和同步文件夹

ruby - 导出拉力赛项目数据

ruby - 在 Ruby 中创建 zip 存档而不将存档文件保存到磁盘

ruby - 从 ruby​​ 哈希中获取所有 key

django - 使用 Django 进行 Web 开发的虚拟环境的最佳实践?

ruby - rbenv 不断生成 vagrant shim