2015-04-02 55 views
1

我有下面的構造在Scala中可以編寫放置在函數參數中的表達式,默認參數值嗎?

class Indexer(
    index: String, 
    host: String, 
    port: Int = DEFAULT_ES_PORT) 

我只是想通過端口參數,如果它不是-1,否則我要使用默認值。 我天真的做法是:

val esi = new Indexer(
    index = es.index, 
    host = es.getHost, 
    port = if (es.getPort != -1) es.getPort 
) 

,但4號線我得到理所當然的編譯器錯誤:

type mismatch; found : Unit required: Int Error occurred in an application involving default arguments. 

因爲else分支的計算結果爲單位。 我當然可以寫這樣的:

val esi = if (es.getPort != -1) { 
    new Indexer(
     index = es.index, 
     host = es.getHost, 
     port = es.getPort 
    ) 
    } else { 
    new Indexer(
     index = es.index, 
     host = es.getHost 
    ) 
    } 

但我不知道是否有一個更簡潔的方式?

回答

1

問題是if (es.getPort != -1) es.getPort缺少else子句,因此該表達式的結果類型爲Unit

你可以通過提供else條款解決:

val esi = new Indexer(
    index = es.index, 
    host = es.getHost, 
    port = if (es.getPort != -1) es.getPort else DEFAULT_ES_PORT 
) 

這當然意味着你需要在你的調用者的代碼以使用DEFAULT_ES_PORT

另一種方法是使用的參數port類型Option[Int]和使用None,如果你想在默認和它的Indexer構造函數中轉換爲Int

+0

尼斯方法,並使用這種方法,你甚至都不需要給默認值的端口類索引。 – curious 2015-04-02 12:08:43

1

我寧願模式匹配:

val esi = es.getPort match { 
     case -1 => new Indexer(es.index,es.getHost) 
     case x => new Indexer(es.index,es.getHost,x) 
    } 
+0

我完全忘了我也可以使用模式匹配。它肯定比我的其他方法好看:) – Midiparse 2015-04-02 12:20:16

相關問題