Изменение параметра в функции в Scala - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь передать параметр по ссылке и обновить функцию.

object CallByName {
  private def inc(x: => Int): Unit = {
    x += 1
  }

  def main(args: Array[String]): Unit = {
    var x = 0
    inc(x)
    println(x)
  }
}

Но x+=1 помечен как ошибка:

Переназначение в val

Я сталкивался с таким утверждением:

Мутация входных параметров часто воспринимается как плохой стиль и затрудняет анализ кода.

Тогда как мне альтернативно добиться того, чего я хочу?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

Мутация входных параметров часто воспринимается как плохой стиль и затрудняет рассуждение о коде.

Это очень верно и, на мой взгляд, должно выполняться всегда ,

передать параметр по ссылке

x: => Int не параметр по ссылке, это параметр by-name .

Тогда как мне альтернативно добиться того, что я хочу?

private def inc(x: Int): Int = {
  x + 1
}
var x = 0
x = inc(x)

Если вы настаиваете на изменении входного параметра, вы можете использовать, например, AtomicInteger и мутировать это в пределах вашего inc метода.

0 голосов
/ 30 апреля 2020

Я пытаюсь передать параметр по ссылке и обновить функцию.

Scala не поддерживает передачу по ссылке. По умолчанию передача по значению , и можно явно определить отдельные параметры как вызов по имени , но это только два поддерживаемых режима.

object CallByName {
 private def inc(x: => Int): Unit = {
   x += 1
 }
}

Это не передача по ссылке, а вызов по имени. Проверьте имя object, там прямо сказано: CallByName.

Тогда как я могу альтернативно достичь того, чего хочу?

К сожалению, Вы не говорите, чего хотите, поэтому сказать невозможно. Единственное, что вы делаете , говорите, что вы хотите пройти по ссылке, и для этого ответ прост:

Вы не можете. Scala не поддерживает передачу по ссылке, точка.

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