为什么以下测试在Scala中返回false?

时间:2011-10-06 01:18:26

标签: scala

以下两个都打印错误。所需的行为是第一个打印为true,第二个打印为false。我不确定为什么总是被打印出来。

def myTest(filter: => Boolean) = () => {

  if (filter) {
    // do something here
    true
  }
  false
}

println(myTest(5 > 3)())
println(myTest(5 > 7)())

3 个答案:

答案 0 :(得分:14)

这个表达式:

if (filter) {
  true
}

是一个表达式,当filter计算结果为true时返回true,否则返回单位()

这个区块:

{
  expr;
  false
}

是一个评估expr的块,丢弃它,然后返回false。

所以:

{
  if (filter) {
    true
  }
  false
}

始终返回false。想象if (filter) { true },如expr;

答案 1 :(得分:5)

huynhjl给出了句法原因。现象学原因是您忘记了else之前的false

scala> def myTest(filter: => Boolean) = () => {
     |
     |   if (filter) {
     |     // do something here
     |     true
     |   }
     |   else false
     | }
myTest: (filter: => Boolean)() => Boolean

scala> println(myTest(5 > 3)())
true

scala> println(myTest(5 > 7)())
false

答案 2 :(得分:2)

最后一个语句是false,所以它返回false,你需要if表达式中的else来有条件地执行该语句。

只是想指出你的filter参数已经解析了一个布尔值,所以if表达式完全是多余的,你的构造可以简单地重写为:

def myTest(filter: => Boolean) = () => filter

可能导致进一步的存在问题。