Scala LazyList конечного диапазона - PullRequest
2 голосов
/ 01 марта 2020

Я пытался создать LazyList из серии элементов, в данном случае блоков, к которым нужно обращаться в трехмерном массиве, как в моде.

  def getBlocks: LazyList[Block] = getBlocks(min.x, min.y, min.z)

  private def getBlocks(x: Int, y: Int, z: Int): LazyList[Block] = {
    val (nextX, nextY, nextZ) = {
      if (z == max.z) (x, y + 1, min.z)
      else if (y == max.y) (x + 1, min.y, min.z)
      else (x, y, z + 1)
    }

    if (y > max.y) LazyList.empty
    else worldService.getBlock(world, x, y, z) #:: getBlocks(nextX, nextY, nextZ)
  }

Генерация Список получился довольно чистым, но я чувствую, что должен быть лучший способ позаботиться об увеличении значений x, y и z в том же порядке, что и в 3 вложенных циклах for (где min.x <= x <= max.x, et c.

1 Ответ

5 голосов
/ 01 марта 2020

Как-то так?

for {
  x <- LazyList.range(min.x, max.x+1)
  y <- LazyList.range(min.y, max.y+1)
  z <- LazyList.range(min.z, max.z+1)
} yield (x, y, z)
//res0: LazyList[(Int, Int, Int)] = LazyList(<not computed>)

На самом деле вам нужно только сделать генератор x LazyList. Тип результата будет следовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...