1

我最近在一个宠物项目中尝试了 Scala,并注意到以下代码片段正在消耗内存(我经常调用此方法):

private[this] def isConsistent(startLang2: Int, lengthLang2: Int, 
    startLang1: Int, lengthLang1: Int,
    lang2FinalAlignments: ArrayBuffer[ArrayBuffer[Int]]): Boolean = {

    (startLang2 to (startLang2 + lengthLang2)) foreach {
      i =>
        val valueSeq = lang2FinalAlignments(i)
        if (valueSeq.size == 0 || valueSeq.exists { value => value < startLang1 || value > (startLang1 + lengthLang1) })
          false
    }
    true
}

当我将“假”更改为“返回假”时,情况似乎已经自行解决:

private[this] def isConsistent(startLang2: Int, lengthLang2: Int, 
    startLang1: Int, lengthLang1: Int,
    lang2FinalAlignments: ArrayBuffer[ArrayBuffer[Int]]): Boolean = {

    (startLang2 to (startLang2 + lengthLang2)) foreach {
      i =>
        val valueSeq = lang2FinalAlignments(i)
        if (valueSeq.size == 0 || valueSeq.exists { value => value < startLang1 || value > (startLang1 + lengthLang1) })
          return false
    }
    true
}

当我考虑它时,片段 #2 对于我期望/希望该方法如何工作是有意义的。有人可以向我解释第一个片段在做什么吗?

4

1 回答 1

2

让我们看看有什么foreach作用:

def foreach[U](f: Elem => U): Unit

所以它f在集合的每个元素上运行并丢弃它的结果——它不关心f.

在你打电话的情况下

... foreach {
  i => {
    ...
    if (...)
      false
  }
true

false如果条件满足则函数体返回,Unit否则返回。它们共同的超类型是Any,所以传递给的函数foreach是类型Int => Any。它的结果被丢弃,你遍历整个集合。(尝试给出明确的类型,例如foreach[Any]or foreach[Boolean]。)

在第二个片段中,情况非常不同:

... foreach {
  i => {
    ...
    if (...)
      return false
  }
true

这里只foreach遍历范围,直到满足条件,然后return转义foreach执行并使 main 函数退出。

于 2013-07-09T07:20:43.517 回答