2012-05-10 24 views
0

我有以下代碼:如何初始化使用Scala不變VAL而不創建其他VAL

private def formatQuery(q:String = ""):String = { 
    val q2 = if (q=="") "*" else "'%s'".format(q) 
    [...] 

我只是想知道是否有避免宣佈Q2值

成才一些習慣的方法像

private def formatQuery(
    q:String = if (q=="") "*" else "'%s'".format(q) 
):String = { 
    [...] 

這顯然是行不通的

回答

4

是否有particula你試圖避免分配給變量q2?風格本身似乎很好。

你提出的建議顯然不起作用,但這裏有兩條建議可行。

如果您的原始功能是:

private def formatQuery(q:String = ""):String = { 
    val q2 = if (q=="") "*" else "'%s'".format(q) 
    doSomething(q2) 
} 

一種選擇是隻通過該if-else表達式,你會通過q2

private def formatQuery(q:String = ""):String = 
    doSomething(if (q=="") "*" else "'%s'".format(q)) 

另一個是讓一個單獨的函數:

private def formatQuery(q:String = ""):String = 
    runQuery(if (q=="") "*" else "'%s'".format(q)) 

private def runQuery(q2:String):String = 
    doSomething(q2) 
+0

我只是不喜歡不得不定義一個新的val,而實際上我只是試圖解除q ...只是一個風格問題,並找出如果斯卡拉提供了一個更優雅的方式來做到這一點... – opensas

+0

你的方法中沒有可變變量(即沒有用'var'聲明)。你應該避免使用'var',並且你已經成功完成了。我看不出爲什麼你應該添加一個。然而,你使用'val'完全沒問題,因爲它是不可變的。 – dhg

+0

哎呀,對不起dhg,剛剛刪除了之前的評論,因爲我沒有很好地理解你的問題... – opensas

2

第三種方式是模式匹配。

private def formatQuery(q: String = ""): String = q match { 
    case _ if q.length == 0 => "*" 
    case _ => "'%s'".format(q) 
} 

我更喜歡你做這件事的方式,首先是因爲它是很好的風格。

1

也許有一個誤區:val方法體內部不是封閉類或特徵的字段或...,但它只是一個局部變量。因此,關鍵字val用於創建用於創建局部變量的字段