Есть ли способ, чтобы аргументы были var вместо val?
При отладке обработки аргументов командной строки в Java я привык делать
args = new String[] { "some", "new", "arguments" };
(особенно полезно, если в качестве аргумента указано имя файла, которое вы часто меняете, но не хотите проходить через некоторые диалоговые окна в IDE). Это дает то преимущество, что я могу просто закомментировать строку при создании релиза.
Поэтому, когда я попробовал это в Scala, я обнаружил, что аргументы val
s. (И я не могу написать 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.