Scala доходность преобразования IndexedSeq - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий фрагмент кода:

val tiles = for {
      x <- 0 to bitmap.length by tileSize
      y <- 0 to bitmap(0).length by tileSize
    } yield new Tile[Number](x, y, tileSize, tileSize,
     data = for {tx <- x to x + tileSize - 1;
          ty <- y to y + tileSize - 1
          } yield (bitmap(tx)(ty)))

Это может показаться сложным, но идея состоит в том, чтобы создать Tile объекты для каждой позиции XY в 3-мерном bitmap объекте. «Вложенный» yield, который задается как параметр data в конструкторе Tile, представляет собой IndexedSeq[Number], который должен быть преобразован в Array[Number] для соответствия типу параметра data. Проблема в том, что метод toArray не существует для конечного yield объекта ed:

val tiles = for {
      x <- 0 to bitmap.length by tileSize
      y <- 0 to bitmap(0).length by tileSize
    } yield new Tile[Number](x, y, tileSize, tileSize,
     data = for {tx <- x to x + tileSize - 1;
          ty <- y to y + tileSize - 1
          } yield (bitmap(tx)(ty).toArray))

вызывает ошибку Cannot resolve symbol toArray, хотя yield (bitmap(tx)(ty).toArray)) отображается как IndexedSeq[java.lang.Number] в IntelliJIDEA и теоретически должен содержать определение toArray метода.

Что происходит за последние yield? Как я могу преобразовать полученную коллекцию в Array? Я знаю, этот код может и должен быть переписан более простым и читаемым образом, но теперь я хочу знать, что происходит за кулисами.

1 Ответ

2 голосов
/ 09 января 2020

Вам необходимо вызвать toArray для получения окончательного результата всех для , а не для каждого yield.

Вы можете сделать это:

val tiles = for {
      x <- 0 to bitmap.length by tileSize
      y <- 0 to bitmap(0).length by tileSize
    } yield new Tile[Number](x, y, tileSize, tileSize,
     data = (for {tx <- x to x + tileSize - 1;
          ty <- y to y + tileSize - 1
          } yield bitmap(tx)(ty)).toArray

Однако этот синтаксис не поддерживается в Scala, рассмотрите этот фрагмент вместо этого.

val tiles = for {
  x <- 0 to bitmap.length by tileSize
  y <- 0 to bitmap(0).length by tileSize
  data = for {
    tx <- x to x + tileSize - 1
    ty <- y to y + tileSize - 1
  } yield bitmap(tx)(ty)
  tile = new Tile[Number](x, y, tileSize, tileSize, data.toArray)
} yield tile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...