使用多个 类 一起作为哈希键
Using multiple classes together as a hash key
我找到了一个计算 3D 模型并组合相同顶点的脚本。它具有以下逻辑,根据我的理解,顶点是顶点 class:
的哈希映射
unless vertices.key?(vertex)
new_vertices << vertex
vertices[ vertex ] = @vertex_index
@vertex_index += 1
end
如果我们找到唯一的 vertex
,我们将其添加到 new_vertices
数组。
我想对此进行修改,以便哈希映射的键是顶点和 material 的组合(两者都是来自 Sketchup 的 classes,这是软件脚本运行)。执行此操作的最佳方法是什么,以便每个键都是两个 classes 而不是一个的组合?某种双重或 class 同时持有顶点和 material?哈希映射支持吗?
在 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
更像 rubyish 的方法是在输入上调用 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}
我找到了一个计算 3D 模型并组合相同顶点的脚本。它具有以下逻辑,根据我的理解,顶点是顶点 class:
的哈希映射unless vertices.key?(vertex)
new_vertices << vertex
vertices[ vertex ] = @vertex_index
@vertex_index += 1
end
如果我们找到唯一的 vertex
,我们将其添加到 new_vertices
数组。
我想对此进行修改,以便哈希映射的键是顶点和 material 的组合(两者都是来自 Sketchup 的 classes,这是软件脚本运行)。执行此操作的最佳方法是什么,以便每个键都是两个 classes 而不是一个的组合?某种双重或 class 同时持有顶点和 material?哈希映射支持吗?
在 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
更像 rubyish 的方法是在输入上调用 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}