迭代数组,然后再次

时间:2015-11-27 08:39:30

标签: ruby iterator

为了导出具有n个点的多边形坐标,我需要n+1个点。另外一个应该“关闭”多边形。目前,我只是遍历整个数组并再次手动完成第一个:

face.outer_loop.vertices.each do |g|
    xml.Grafic(
        :X=>g.position.x, 
        :Y=>g.position.y, 
        :Z=>g.position.z)
end
xml.Grafic(
    :X=>face.outer_loop.vertices[0].x, 
    :Y=>face.outer_loop.vertices[0].y, 
    :Z=>face.outer_loop.vertices[0].z)

有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我可以考虑一下:

COORDS = %i(X Y Z)
(face.outer_loop.vertices + [face.outer_loop.vertices.first]).each do |g|
  values = COORDS.map do |c|
    g.position.public_send "#{c.to_s.downcase}"
  end
  xml.Graphic COORDS.zip(values).to_h
end

或使用each_with_object不会污染全局命名空间中的coords

(face.outer_loop.vertices + [face.outer_loop.vertices.first]).each_with_object(%i(X Y Z)) do |g, coords|
  values = coords.map do |c|
    g.position.public_send "#{c.to_s.downcase}"
  end
  xml.Graphic coords.zip(values).to_h
end