何时在 Scala 中使用关键字 return

When to use keyword return in Scala

我很早就知道没有理由在 Scala 中使用 return 关键字(据我所知)。话虽这么说,我发现了一个示例,其中只需更改添加 return 关键字即可使我的功能正常工作,而以前却没有。

相关代码来自 my solution to the Advent of Code 第 7 天挑战。


def containsShinyGoldBag(bagContents: Map[String, List[String]], currentBag: String): Boolean = {
    val contents = bagContents(currentBag)

    if (bagContents(currentBag).contains("shiny gold") ) {
        // Base Case: Bag Found in list of bags
        true
    } else if (contents == List.empty){
        // Base Case: Dead End
        false
    } else {
        // Continue searching down list

        // Ideal solution ( gives same result as the working solution without return keyword )
        // for (b <- contents) containsShinyGoldBag(bagContents, b)

        // Working solution
        for (b <- contents) {
            if (containsShinyGoldBag(bagContents, b)) {
                println(s"Found one! $b inside a $currentBag")
                return true // <--- culprit
            }
            else false
        }
        false
    }
}

// In the main function

var count = 0
for (bag <- bagContents.keys) {
    if (containsShinyGoldBag(bagContents, bag)) {
        count = count + 1
    }
}
println(s"There are $count way to bring a shiny gold bag!")

当我 运行 没有 return 的代码时,我最终得到 count = 7,这是直接包含闪亮金袋的袋子数量,而不是正确的计数在他们的其他包中的某个地方包含一个闪亮的金色包的包。

一个函数return它计算的最后一个表达式的值;在您的情况下,这将是以下之一:

  1. trueif (bagContents(currentBag).contains("shiny gold") ) 之后;

  2. falseelse if (contents == List.empty) 之后;

  3. 最后一个false.

true 不在这样的位置,所以你需要 return 来,嗯,使函数 return 它。否则它会被评估并被忽略,因为你没有对它做任何事情。所以else false在同一个for中,其实可以去掉,不改变意思。

避免return的替代方法是

contents.exists(b => containsShinyGoldBag(bagContents, b))