9

When debugging command line argument handling in Java I'm used to doing

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

(especially useful if have a filename as argument which you frequently change, but don't want to go through some dialog windows in the IDE). This has the benefit that I can simply comment out the line when building a release.

So when I tried this in Scala I discovered that arguments are vals. (And I can't write var in front of the parameter).

  • Q1: What's the rationale for this?
  • Q2: So is there any obvious work-around except for doing

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

    and stick to newArgs in the remaining main method?

aioobe
  • 413,195
  • 112
  • 811
  • 826

3 Answers3

13

Q1: Mutating the input parameters is often seen as bad style and makes it harder to reason about code.

Q2: You could assign the args to a var before doing anything with it.

soc
  • 27,983
  • 20
  • 111
  • 215
  • Q1, good point. Q2, yes. That's better than the if-line, because then I can simply comment out the reassignment as in the case of Java. Thanks! – aioobe Mar 17 '11 at 08:26
1

Arrays are mutable, so if you insist:

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

That does, of course, only work if there is enough space in the passed array.

Remember that you can use default parameters in Scala to solve your original probem in a much cleaner way.

Raphael
  • 9,779
  • 5
  • 63
  • 94
  • Could you give an example of such default parameter for the main method? – aioobe Mar 18 '11 at 11:00
  • Ah, sorry, got carried away there. Does not work since in case of no parameters, an empty array is passed. Maybe that might be worth a change. – Raphael Mar 19 '11 at 13:20
0

If you only want to modify the args inside of the function, then your approach in the description is enough.

However, if you need to treat it as a true "reference" type and keep the modifications valid outside the function, you can wrap the arguments in a case class, e.g.:

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

And use it like:

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

Then, when you use refInt.value outside the function, it would still be 3.

Colliot
  • 1,522
  • 3
  • 16
  • 29