Передача аргументов функции по имени Scala

#scala

#scala

Вопрос:

У меня есть следующий код scala. В этом коде я передаю (глобальное) строковое имя функции и хочу изменить строку в зависимости от первого аргумента, как показано ниже:

 def retVal(x: (String,String), y: => String) = {if (x._1 != "") {y = x._1;x} else (y,x._2)}
  

Но когда я запускаю этот код, я получаю следующую ошибку:

 y = x._1
  ^
reassignment to a val
  

Как я могу изменить код, чтобы глобальная строковая переменная обновлялась при вызове этой функции?

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

1. Вероятно, вы делаете что-то не так. Обычно вам не нужны функции, подобные вашей retVal . Можете ли вы показать нам контекст, в котором вы вызываете retVal ?

Ответ №1:

Аргументы функции по умолчанию неизменяемы в Scala. Вы не можете присвоить значение a параметру функции.

В вашем случае вы пытаетесь присвоить вызову по имени параметр, что вообще невозможно.

Кроме того, мутация — это плохо, вместо этого возвращайте значение и присваивайте его новой переменной.

Но все же, если вы хотите мутировать, сделайте что-то вроде этого

 object MutationBox {
 var globalString = ""

 def retVal(x: (String,String)) = {
  if (x._1.nonEmpty) {
    globalString = x._1
    x
   } else (globalString, x._2)
 }
  

}