#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)