2011-03-17 83 views
9

当调试命令行参数在Java中处理我已经习惯了做有没有办法让参数是var而不是val?

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

(尤其是有用的,如果有一个文件名作为参数,它您经常更改,但不想去通过在一些对话窗口IDE)。这有一个好处,我可以在构建发布时简单地注释该行。

所以当我在斯卡拉尝试这个时,我发现参数是val s。 (而且我不能在参数前面写var)。

  • Q1:这是什么原因?
  • Q2:那么,有没有明显的变通除了在剩下的主要方法做

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

    ,并坚持newArgs

回答

13

Q1:变异的输入参数常常被视为不良作风,使之更难推论代码。

Q2:在做任何事情之前,您可以将args分配给var

+0

Q1,好点。 Q2,是的。这比if行更好,因为那样我就可以简单地将重新分配注释掉,就像Java一样。谢谢! – aioobe 2011-03-17 08:26:12

1

数组是可变的,所以如果你坚持:

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

那请问,当然只是如果传递的数组足够的空间工作。

请记住,您可以使用Scala中的默认参数以更简洁的方式解决原始探针问题。

+0

你能举一个这样的主要方法的默认参数的例子吗? – aioobe 2011-03-18 11:00:37

+0

啊,对不起,在那里被带走了。因为在没有参数的情况下不起作用,所以传递一个空数组。也许这可能值得改变。 – Raphael 2011-03-19 13:20:32

0

如果您只想修改函数内部的参数,那么您在描述中的方法就足够了。

但是,如果你需要把它当作一个真正的“参考”类型,并保持了修改有效的功能外,你可以用参数的情况下类,如:

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

并使用它像:

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

然后,当您使用refInt.value的功能之外,它仍然是3

相关问题