如何在Scala类中初始化函数类型参数?

时间:2015-01-06 15:15:04

标签: scala

例如,我有一个这样的代码:

class Foo(name: String = "", callback: String => String) {

  def doCallback(arg: String): String = {
    callback(arg)
  }
}

问题:

1。Foo类构造函数中,如何为callback参数提供默认值?是否可以将其设置为null?还是有更好的选择吗?

class Foo(name: String = "", callback: String => String = null) {
  ...
}

2。如果回答问题没有。 1不是null,如何在callback方法中调用之前检查doCallback?例如,假设null是可以接受的,我可以这样做:

class Foo(name: String = "", callback: String => String = null) {

  def doCallback(arg: String): String = {
    if (callback != null) callback(arg) else ""  // the checking of not null
  }
}

2 个答案:

答案 0 :(得分:4)

class Foo(name: String = "", callback: Option[String => String] = None) {

def doCallback(arg: String): String = {
  val call: Option[String] = callback.map(c => c(arg)) // which will either be None or Some(String)

  call match {
      case Some(s: String) => s
      case None => null
    }
  }
}

当然,如果您将doCallback的签名更改为Option[String],则您不必进行模式匹配。

一般来说,避免在Scala中使用null是一种很好的做法。其中一个好处是没有获得NullPointerException

但是,这种方法会强制您在callback内传递Some()类实例化。

或者,更符合原始请求:

class Foo(name: String = "", callback: String => Option[String] = {(s) => None}) {

  def doCallback(arg: String): String = {
    val call: Option[String] = callback(arg)

    call match {
      case Some(s: String) => s
      case None => null
    }
  }
}

答案 1 :(得分:1)

正如其他人所说,用Option包装所有内容是件好事 但是,如果您只想将默认结果设为"",那么事情可能会更容易一些:

val alwaysEmpty = { given: String => "" }

class Foo(val doCallback: String => String = alwaysEmpty)