2

我有一个播放模板,其中参数的最典型场景是“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什么魔法?调用空变量无异常。

4

1 回答 1

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清理的例子,但这应该给你一个想法。

于 2012-04-30T21:29:59.303 回答