开发者

Is there a way to let arguments be var instead of val?

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 disc开发者_运维问答overed 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?


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.


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜