一起使用多个类作为哈希键

时间:2018-08-28 09:42:48

标签: ruby data-structures ruby-hash

我找到了一个脚本,该脚本可以计算3D模型并合并相同的顶点。它具有以下逻辑,根据我的理解,顶点是顶点类的哈希图:

unless vertices.key?(vertex)
  new_vertices << vertex
  vertices[ vertex ] = @vertex_index
  @vertex_index += 1
end

如果找到唯一的vertex,则将其添加到new_vertices数组中。

我想对此进行修改,以使哈希图的键是顶点和材质的组合(两者都是Sketchup中的类,Sketchup是该脚本运行的软件)。这样做的最佳方法是什么,以便每个键是两个类的组合而不是一个?某种同时包含顶点和材料的双元组或类?哈希图支持吗?

1 个答案:

答案 0 :(得分:1)

在Ruby中,任何人都可以将其用作哈希键:

hash = {
  42 => "an integer",
  [42, "forty two"] => "an array",
  Class => "a class"
}
#⇒  {42=>"an integer", [42, "forty two"]=>"an array", Class=>"a class"}

hash[[42, "forty two"]]
#⇒ "an array"

也就是说,您可能会使用数组[vertex, material]作为键:

unless vertices.key?([vertex, material])
  new_vertices_and_materials << [vertex, material]
  vertices[[vertex, material]] = @vertex_index
  @vertex_index += 1
end

更红宝石的方法是在输入上调用Enumerable#uniq并执行以下操作:

input = [ # example input data
  [:vertex1, :material1],
  [:vertex2, :material1],
  [:vertex2, :material1],
  [:vertex2, :material2],
  [:vertex2, :material2]
]
new_vertices_and_materials = input.uniq
vertices_and_materials_with_index =
  new_vertices_and_materials.
    zip(1..new_vertices_and_materials.size).
    to_h
#⇒ {[:vertex1, :material1]=>1,
#   [:vertex2, :material1]=>2,
#   [:vertex2, :material2]=>3}