例如,我有一个这样的代码:
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
}
}
答案 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)