Есть ли способ, чтобы аргументы были var вместо val? - PullRequest
9 голосов
/ 17 марта 2011

При отладке обработки аргументов командной строки в 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 ]

13 голосов
/ 17 марта 2011

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

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

1 голос
/ 17 марта 2011

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

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

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

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

0 голосов
/ 07 октября 2017

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

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

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

и использовать его следующим образом:

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

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

...