Scala не выполняет цикл for

#scala

#scala

Вопрос:

У меня есть задание, в котором мне нужно разработать N строк подряд в Scala. Для представления платы я хочу выполнить цикл по 2d-массиву и напечатать X ‘ en O’s. Это код для этого:

   override def toString(): String = {
    val repres = ""

    for (rowIndex <- 0 until board.length - 1) {
      for (columnIndex <- 0 until board(rowIndex).length - 1) {
        if (board(rowIndex)(columnIndex) == Player.Player1) {
          repres   "X"
        } else if (board(rowIndex)(columnIndex) == Player.Player2) {
          repres   "O"
        } else if (board(rowIndex)(columnIndex) == Player.NoPlayer) {
          repres   "_"
        } else {
          throw new IllegalArgumentException
        }
      }
      repres   Properties.lineSeparator
    }
    repres
  }
  

Это плата:

 var board = Array.fill[Player](rows,columns) {Player.NoPlayer}
  

По какой-то причине он не выполняет цикл for, хотя board.length равен 6 при отладке.

Я новичок в scala, поэтому, вероятно, есть что-то очень очевидное неправильное, чего я просто не вижу.

Спасибо за помощь

Ответ №1:

Я думаю, проблема не в цикле. Вы ожидаете repres изменений?

Вы объявили его repres как неизменяемый String . Все операции, которые вы выполняете, в значительной степени бесполезны, это создает новую строку в каждой ветви, но вы ничему ее не присваиваете. Последний оператор возвращает repres как пустой String .

Попробуйте изменить объявление на var repres .

Затем каждая из ветвей должна измениться на repres = repres "X" и т.д.

Обратите внимание, что это на самом деле не функционально. Это просто Java, адаптированная к синтаксису Scala.

Комментарии:

1. Ах, спасибо. Конечно. Совершенно забыл об этом. Раньше я выполнял repres = repres «X», но это выдавало ошибку. Не понял, что это потому, что я использовал val вместо var. Я знаю, что это не работает. Цель назначения состоит в том, чтобы сначала выполнить это таким образом, а позже изменить его на функциональный

Ответ №2:

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

В 95% случаев использования в scala вам не нужно изменяемое состояние, поэтому я рекомендую вам просто притворяться, что его вообще не существует, пока вы не овладеете языком в достаточной степени, чтобы быть в состоянии окончательно различать остальные 5% случаев.

  val repres = board.flatten.map { 
   case Player.Player1 => "X"
   case Player.Player2 => "O"
   case _ => "_"
 }.mkString
  .grouped(board.length)
  .mkString(Properties.lineSeparator)