def hasAnnotation(symbol: Symbol, annotation: Type): Boolean = {
for (a <- symbol.annotations) {
if ( a.tpe =:= annotation ) return true // AVOID USING RETURN!!!
}
false
}
为什么要添加回归邪恶?
如何在不返回的情况下快速迭代?
答案 0 :(得分:11)
执行您要求的功能的更实用的方法是
def hasAnnotation(symbol: Symbol, annotation: Type) =
symbol.annotations.exists(_.type =:= annotation)
这将在找到满足谓词的第一项时发生短路。回归不是邪恶,它更加迫切。 Here's指向另一篇关于退出循环的帖子的链接
答案 1 :(得分:3)
nattyddubbs有一个很好的函数实现,没有返回,但我可以补充一点为什么intellij会警告你。
基本上return
在scala中的工作方式与您的预期略有不同 - jetbrains的人知道并且已经添加了警告以确保您真的希望返回那里。
问题是它将调用者返回到返回出现的方法...而不是函数。看到这个的最佳位置是匿名函数,例如,想象一下你有一个总结列表的函数
scala> def summer(as: List[Int]): Int = as.foldRight(0)((i,j) => i + j)
scala> summer(List(33, 42, 99))
res2: Int = 174
冷却。如果你使用return会怎么样?
scala> def summer(as: List[Int]): Int = as.foldRight(0)((i,j) => return i + j)
scala> summer(List(33, 42, 99))
res3: Int = 99
该功能的含义已完全改变......你可能没想到它
好的,你可能永远不会在这样的简单函数中写一个返回,但是你可以很容易地在一个更复杂的lambda中做到这一点并最终得到你不期望的结果
Rob Norris在scala here写了一篇关于回归的好文章,真的值得一读