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

Far*_*mor 2 scala playframework

我有一个播放模板,其中参数的最典型场景是"null".
我已经明白,惯用的Scala更喜欢Option.
我来自java的第一个直觉是使用null.

带null的情况:
在控制器中

views.html.addPost(errors.errorsAsJson)
Run Code Online (Sandbox Code Playgroud)

在视图中

@(errors: play.api.libs.json.JsValue = null) 
...
@if(errors != null){@errors}
Run Code Online (Sandbox Code Playgroud)

选项案例:
在控制器中

views.html.addPost(Option(errors.errorsAsJson))
Run Code Online (Sandbox Code Playgroud)

在视图中

@(errors: Option[play.api.libs.json.JsValue] = None)
...
@{errors match {
      case None => {}
      case _ => {errors.get}
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:我现在明白了.
代替:

@{errors match {
    case None => {}
    case _ => {errors.get}
 }
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做

@errors
Run Code Online (Sandbox Code Playgroud)

更新2: 显然我没有用null进行空检查?也许有些Play framework神奇?调用null变量毫无例外地工作.

dhg*_*dhg 9

原因Option是不那么冗长,你不需要做那些空检查.换句话说,你的match/case冗长是不必要的.

我们假设我们有这两个变量:

val x: Option[Int] = Some(5)
val y: Option[Int] = None
Run Code Online (Sandbox Code Playgroud)

如果我们想要调用函数Some而不是函数None,我们不需要进行null检查:

x foreach println  // prints 5
y foreach println  // nothing printed
Run Code Online (Sandbox Code Playgroud)

或者,如果我们想要应用一个函数并获得一个新结果,它就会相似,并跟踪输入是否存在.

val f = (i: Int) => i + 1
x map f  // Some(6)
y map f  // None
Run Code Online (Sandbox Code Playgroud)

有很多关于如何Option清理事物的例子,但这应该给你一个想法.

  • 这是一个非常方便的链接:http://blog.tmorris.net/scalaoption-cheat-sheet/.它有助于缩短Option的许多模式匹配方案.当我第一次学习斯卡拉时,它帮助了我很多. (4认同)