Использование нескольких классов вместе в качестве хеш-ключа - PullRequest
0 голосов
/ 28 августа 2018

Я нашел скрипт, который вычисляет 3D-модели и объединяет идентичные вершины. Он имеет следующую логику, где, согласно моему пониманию, вершины являются хэш-картами класса вершин:

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

Если мы находим vertex, который уникален, мы добавляем его в массив new_vertices.

Я бы хотел изменить это так, чтобы ключ для хэш-карты представлял собой комбинацию вершины и материала (оба являются классами из Sketchup, программного обеспечения, в котором работает этот скрипт). Каков наилучший способ сделать это, чтобы каждая клавиша была комбинацией двух классов вместо одного? Какой-то дуплекс или класс, содержащий как вершину, так и материал? Это поддерживается хеш-картой?

1 Ответ

0 голосов
/ 28 августа 2018

В 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...