2012-09-08 42 views
1

我試圖儘可能避免可變變量,但有時它只是感覺太難了,我不想以極其複雜的代碼結束試圖避免斯卡拉mutables ..這是正確的方式?

不過,我發現這種方式來做到這一點,但它肯定感覺就像作弊

我解析查詢,我發現找到一個字段!值,我想將它翻譯爲字段:值,然後繼續處理,所以我出來這個代碼以避免易變,或至少讓他們被限制...

val (operator, negated) = { 
    var operator = ConditionOperator.toConditionOperator(parsedOperator) 
    var negated = parsedNegated == "!" 
    // field!value => field notEqual value 
    if (negated && operator == ConditionOperator.Unknown) { 
    negated = false 
    operator = ConditionOperator.NotEqual 
    } 
    (operator, negated) 
} 

這是正確的方式 去做吧???或者是否有一種更習慣(並且清晰)的方式來實現這種事情?

+0

非常感謝,DHG和蘇亞雷斯克爾都是正確的,我不知道誰是先......順便說一句,我不知道會是什麼在這種情況下會一成不變的好處?幫助編譯器優化整個事情?在多核系統中運行這些代碼的麻煩較少? – opensas

回答

6

這確實是作弊,因爲var是可變的!

來糾正這個問題的方法是簡單地直接返回if語句的結果:

val (operator, negated) = { 
    val operator = ConditionOperator.toConditionOperator(parsedOperator) 
    val negated = parsedNegated == "!" 
    // field!value => field notEqual value 
    if (negated && operator == ConditionOperator.Unknown) 
    (ConditionOperator.NotEqual, false) 
    else 
    (operator, negated) 
} 
3

這樣做將沒有臨時瓦爾任,因爲你並不真正需要它們的典型方式。

val operator = ConditionOperator.toConditionOperator(parsedOperator) 
val negated = parsedNegated == "!" 
if (!negated || operator != ConditionOperator.Unknown) (operator, negated) 
else (ConditionOperator.NotEqual, false) 
1

那麼你可以通過把negated簡化出來。然後,模式匹配比以前更乾淨。

val negated = parsedNegated == "!" 
val operator = ConditionOperator.toConditionOperator(parsedOperator) match { 
    case op if negated && op == ConditionOperator.Unknown => ConditionOperator.NotEqual 
    case op => op 
} 
+0

現在我改變了代碼,但考慮到在問題的代碼中我也改變了否定的值... – opensas