scala – 从游戏动作中明确返回
我有以下行动
def login: Result = Action(parse.json) { request => if (/* Let's we say here is some validation */) { return BadRequest("bad") } Ok("all ok") } 这给了我一个错误. Intellij建议使用Action [JsValue]类型.当我说return将是那种类型时,我在BadRequest行上再次出错,因为类型不匹配. 我试着搜索这个问题,我找到了一些建议将Action [AnyContent]设置为返回类型的答案.但我仍然得到错误. 另外我需要从if返回…之后我不想写其他如果,因为在一些更复杂的函数中,我很可能会有很少的if语句应该打破动作,如果我使用if / else方法,代码将成为噩梦. 解决方法
当然可以.在Scala中,嵌套匿名函数中的“return”语句是通过抛出和捕获NonLocalReturnException来实现的.它在
Scala Language Specification第6.20节中这样说.
这样做是因为为了理解,人们能够编写如下代码: def loop() = { for (i <- 0 until 20) { if (someCondition) return } } 该循环实际上相当于: (0 until 20).foreach { i => if (someCondition) return } 你能看到匿名功能吗?你能看到有问题的“回归”并不是指单独从匿名函数返回吗?在我看来,这是一个设计错误.另一方面,在像Scala这样的语言中,无论如何都不需要“返回”. 所以你有一个匿名函数: Action(parse.json) { request => ... this one here ... } 在该函数内部,您正在使用“返回”,它会触发异常. 所以Scala中的一般经验法则 – 永远不要使用返回.无论如何,这是一种面向表达的语言.你不需要它. Action(parse.json) { request => if (/* Let's we say here is some validation */) BadRequest("bad") else Ok("all ok") } 在那里,更加惯用.顺便说一句 – 你也没有“休息”或“继续”.习惯没有他们的工作.另外,关于你的意见:
这是错误的,我真的很讨厌使用依赖于返回,中断或继续的代码来精确地短路逻辑,因为复杂的逻辑变得混乱,我希望有一个清晰的视图: >不变量,如果我们谈论循环 使用返回,中断或继续破坏所有3点的清晰度.它们并不比GOTO跳跃好多少.如果你有复杂的功能,如果阅读它会开始成为一个问题,将它们分成多个功能. 此外,比多个“if / else”分支更好的是“匹配”语句.一旦你习惯了它们,你会爱上它们,特别是考虑到编译器甚至可以在你错过分支的某些情况下保护你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |