scala避免返回,同时仍然在执行迭代

时间:2016-04-26 15:29:15

标签: scala

当我写下以下内容时,IntelliJ的scalastyle对我很不满。我写回报并不是这样。

def hasAnnotation(symbol: Symbol, annotation: Type): Boolean = {
  for (a <- symbol.annotations) {
    if ( a.tpe =:= annotation ) return true  // AVOID USING RETURN!!!
  }
  false
}

为什么要添加回归邪恶?

如何在不返回的情况下快速迭代?

2 个答案:

答案 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写了一篇关于回归的好文章,真的值得一读