在Scala中是否可以编写放置在函数参数中的表达式,默认参数值?

时间:2015-04-02 11:59:23

标签: scala

我有以下构造函数

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
    )
  }

但我想知道是否有更简洁的方法?

2 个答案:

答案 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)
  }