scala - 为什么确保仅在其他方面起作用?

标签 scala assertions

在scala中,当我使用并确保 predef时,它仅适用于if-else表达式的else部分:

def evenIt(x:Int) = {
    if(x % 2 == 0)
            x+1 //return odd on purpose!
    else{
      x + 1
    } ensuring( _ % 2 == 0)
}

//Test it:
evenIt(3)
> 4
evenIt(4)
> 5  //<--- ensuring does not catch this!

但是我认为“if-else”是scala中的一种表达。因此,它应该只返回一个值-继而应将其传递给并确保

还是我在这里感到困惑?谢谢。

编辑:在《 Scala中的编程》一书中,作者按如下方式使用它:
private def widen(x: Int) : Element =
   if(w <= width)
      this
   else {
      val left = elem(' ', (w - width) / 2, height)
      var right = elem(' ', w - width - left.width, height)
      left beside this beside right
   } ensuring ( w <= _.width

他是否仅将其应用于此处的其他部分?

最佳答案

是的,如果if-else是一个表达式,但是将其括在方括号中的方式仅是将ensuring应用于x+1,而不是if -expression。如果将ensuring放在if的右大括号后面,它将完成您想要的操作:

def evenIt(x:Int) = {
    if(x % 2 == 0)
        x + 1 //return odd on purpose!
    else
        x + 1
} ensuring( _ % 2 == 0)

关于scala - 为什么确保仅在其他方面起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843791/

相关文章:

Scala:如何使 toString() 接受隐式参数?

java - Eclipse 在组织导入时用 StricAssertions 替换 Assertions

python - (django 测试)assertIs 错误

scala - Akka 流 - 在失败后使用广播和 zip 恢复图形

json - 如何避免 Play Framework Json Reads 提供的自动转换,而是获取异常

java - 安装scala出现错误

vba - 使用 Rubberduck 单元测试,我如何找出多个断言中的哪一个失败?

json - Play Framework 和 Scala Json,解析包含 JSArray 和 JSObject 的 json

c# - 执行 Assert.AreMatch() 以深入比较两个对象中的属性

c++ - 性能断言