我有一个播放模板,其中参数的最典型场景是“null” 我已经明白,习惯性的Scala更喜欢Option 我来自java的第一个直觉就是使用null。
null的情况:
在控制器
views.html.addPost(errors.errorsAsJson)
在视图中
@(errors: play.api.libs.json.JsValue = null)
...
@if(errors != null){@errors}
选项案例:
在控制器
views.html.addPost(Option(errors.errorsAsJson))
在视图中
@(errors: Option[play.api.libs.json.JsValue] = None)
...
@{errors match {
case None => {}
case _ => {errors.get}
}
}
更新:我现在知道了。
而不是:
@{errors match {
case None => {}
case _ => {errors.get}
}
}
我可以做到
@errors
更新2:
显然我没有用null进行null检查?也许有些Play framework
魔法?调用null变量毫无例外地工作。
答案 0 :(得分:9)
Option
更简洁的原因是您不需要进行那些空检查。换句话说,您的match/case
详细程度是不必要的。
我们假设我们有两个变量:
val x: Option[Int] = Some(5)
val y: Option[Int] = None
如果我们想调用Some
而不是None
的函数,我们不需要进行空检查:
x foreach println // prints 5
y foreach println // nothing printed
或者,如果我们想要应用一个函数并获得一个新结果,它就是相似的,并跟踪输入是否存在。
val f = (i: Int) => i + 1
x map f // Some(6)
y map f // None
还有更多关于Option
如何清理事物的例子,但这应该会给你一个想法。