何时在 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它计算的最后一个表达式的值;在您的情况下,这将是以下之一:
true
在 if (bagContents(currentBag).contains("shiny gold") )
之后;
false
在 else if (contents == List.empty)
之后;
最后一个false
.
true
不在这样的位置,所以你需要 return
来,嗯,使函数 return 它。否则它会被评估并被忽略,因为你没有对它做任何事情。所以else false
在同一个for
中,其实可以去掉,不改变意思。
避免return
的替代方法是
contents.exists(b => containsShinyGoldBag(bagContents, b))
我很早就知道没有理由在 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它计算的最后一个表达式的值;在您的情况下,这将是以下之一:
true
在if (bagContents(currentBag).contains("shiny gold") )
之后;false
在else if (contents == List.empty)
之后;最后一个
false
.
true
不在这样的位置,所以你需要 return
来,嗯,使函数 return 它。否则它会被评估并被忽略,因为你没有对它做任何事情。所以else false
在同一个for
中,其实可以去掉,不改变意思。
避免return
的替代方法是
contents.exists(b => containsShinyGoldBag(bagContents, b))