期望Scala中为null。应该使用选项吗?

时间:2012-04-30 21:23:59

标签: scala playframework

我有一个播放模板,其中参数的最典型场景是“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变量毫无例外地工作。

1 个答案:

答案 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如何清理事物的例子,但这应该会给你一个想法。