Есть ли способ, чтобы аргументы были var вместо val?

При отладке обработки аргументов командной строки в Java я привык делать

args = new String[] { "some", "new", "arguments" };

(особенно полезно, если в качестве аргумента указано имя файла, которое вы часто меняете, но не хотите проходить через некоторые диалоговые окна в IDE). Это дает то преимущество, что я могу просто закомментировать строку при создании релиза.

Поэтому, когда я попробовал это в Scala, я обнаружил, что аргументы vals. (И я не могу написать var перед параметром).

  • Q1: в чем причина этого?
  • Q2: Так есть ли очевидный обходной путь, кроме как

    val newArgs = if (...) args else Array("some", "new", "arguments")
    

    и придерживаться newArgs в оставшемся основном методе?

3 ответа

Решение

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

Q2: Вы можете назначить args к var прежде чем что-то делать с этим.

Массивы изменчивы, поэтому, если вы настаиваете:

Seq("some", "new", "arguments").copyToArray(args, 0, 3)

Это, конечно, работает, только если в переданном массиве достаточно места.

Помните, что вы можете использовать параметры по умолчанию в Scala, чтобы решить вашу первоначальную задачу гораздо чище.

Если вы хотите изменить только аргументы внутри функции, тогда вашего подхода в описании достаточно.

Однако, если вам нужно рассматривать его как истинный "ссылочный" тип и сохранять модификации действительными вне функции, вы можете заключить аргументы в класс case, например:

case class Ref[A](var value: A)

И используйте это как:

def modify(refInt: Ref[Int]) = refInt.value = 3

Затем, когда вы используете refInt.value вне функции это все равно будет 3.

Другие вопросы по тегам