Scala中应为null。是否应该使用该选项?
我有一个播放模板,其中参数的最典型场景是“null”。Scala中应为null。是否应该使用该选项?,scala,playframework,Scala,Playframework,我有一个播放模板,其中参数的最典型场景是“null”。 我明白,惯用的Scala更喜欢选项。 我来自java的第一个直觉是使用null 空值的大小写: 内部控制器 views.html.addPost(errors.errorsAsJson) views.html.addPost(Option(errors.errorsAsJson)) 鉴于 @(errors: play.api.libs.json.JsValue = null) ... @if(errors != null){@erro
我明白,惯用的Scala更喜欢选项。
我来自java的第一个直觉是使用null 空值的大小写:
内部控制器
views.html.addPost(errors.errorsAsJson)
views.html.addPost(Option(errors.errorsAsJson))
鉴于
@(errors: play.api.libs.json.JsValue = null)
...
@if(errors != null){@errors}
@(errors: Option[play.api.libs.json.JsValue] = None)
...
@{errors match {
case None => {}
case _ => {errors.get}
}
}
带有选项的案例:内部控制器
views.html.addPost(errors.errorsAsJson)
views.html.addPost(Option(errors.errorsAsJson))
鉴于
@(errors: play.api.libs.json.JsValue = null)
...
@if(errors != null){@errors}
@(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检查?也许是一些
游戏框架
魔术?调用null变量毫无例外地工作。之所以选项
不那么详细,是因为您不需要执行那些null检查。换句话说,您的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
还有很多关于
选项如何清理东西的例子,但这应该会给你一个想法。很酷,谢谢,这真的很有效。只是测试了和@errors,没有模式匹配。这里可能值得特别指出getOrElse
,因为它是match
最直接的替代品。这里有一个非常方便的链接:。它有助于缩短Option的许多模式匹配场景。当我第一次学习scala时,它对我帮助很大。使用Option的关键原因是,在任何地方使用它都会导致运行时NullPointerException,这是由于程序员没有意识到(或只是忘记)方法可能并不总是将其记录的返回类型的有效值返回到编译时错误中,然后提示您立即在正确的位置修复问题(即使该修复只是添加了。get
声明“是,如果这是None
”,我希望此代码在运行时崩溃)。即使它需要更多的输入(尽管它不必像您的示例那样糟糕,如dhg的回答所示),这仍然是一个优势。