2011-03-17 47 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

相關問題