我有以下构造函数
class Indexer(
index: String,
host: String,
port: Int = DEFAULT_ES_PORT)
我只想传递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分支评估为Unit。 我当然可以这样写:
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
)
}
但我想知道是否有更简洁的方法?
答案 0 :(得分: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
,如果您想要默认值并将其转换为构造函数中的Int
Indexer
。
答案 1 :(得分:1)
我更喜欢模式匹配:
val esi = es.getPort match {
case -1 => new Indexer(es.index,es.getHost)
case x => new Indexer(es.index,es.getHost,x)
}