何时在Scala中使用关键字return

何时在Scala中使用关键字return,scala,recursion,return,sbt,Scala,Recursion,Return,Sbt,我很早就知道,在Scala中没有理由使用return关键字(据我所知)。也就是说,我发现了一个例子,在这个例子中,只需更改添加return关键字,我的函数就可以工作,而以前没有 问题代码来自第7天的挑战 def containsShinyGoldBag(bagContents: Map[String, List[String]], currentBag: String): Boolean = { val contents = bagContents(currentBag) i

我很早就知道,在Scala中没有理由使用
return
关键字(据我所知)。也就是说,我发现了一个例子,在这个例子中,只需更改添加
return
关键字,我的函数就可以工作,而以前没有

问题代码来自第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!")


def包含ShinyGoldBag(bagContents:Map[String,List[String]],currentBag:String):布尔={
val内容=行李内容(当前行李)
if(bagContents(currentBag).contains(“闪亮黄金”)){
//基本案例:在行李列表中找到的行李
真的
}else if(contents==List.empty){
//基本情况:死胡同
假的
}否则{
//继续向下搜索列表
//理想溶液(给出与工作溶液相同的结果,无返回关键字)

//对于(bA函数,它返回它计算的最后一个表达式的值;在您的情况下,这将是:

  • true
    if(行李内容物(currentBag).contains(“闪亮的金色”)
    之后

  • false
    else if之后(contents==List.empty)

  • 最后一个
    false

  • true
    不在这样的位置,因此您需要
    return
    来让函数返回它。否则它会被计算并忽略,因为您没有对它执行任何操作。
    else false
    相同,实际上,它可以在不改变含义的情况下被删除

    避免返回的替代方法如下

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

    从技术上讲,你从来都不需要它,每一个可能需要它的算法都可以以一种或另一种不需要它的方式重写。-实际上,有时替代方案更难理解或效率更低,那么为什么不使用它呢?-就我个人而言,我从来没有找到使用它的好理由(在我自己的代码中)因为它通常在更具命令性的代码中很常见,而我的代码通常更具功能,而且像cats这样的东西在您可能需要它的时候提供了很好的替代方法,仅使用stdlib(
    traverse
    是最常见的示例)@LuisMiguelMejíaSuárez我明白这是没有必要的。我只是想问,这个特定的例子如何让添加
    return
    得到不同的结果?这正是避免它的原因。因为它可能意味着不同的事情。有时它可能意味着你希望它意味着什么(如本例)有时不是这样。
    return
    的问题在于它并不总是像Java中的
    return
    那样工作-非本地返回(来自lambdas和for循环)使用异常来中断,并且非常混乱。