【问题标题】:Is there some reason to avoid return statements是否有理由避免返回语句
【发布时间】:2012-09-02 07:16:50
【问题描述】:

有时我会看到大量的 Scala 代码,其中包含多个嵌套级别的条件和匹配,使用显式返回退出函数会更清晰。

避免那些显式的返回语句有什么好处吗?

【问题讨论】:

  • 这是return上的相关博文

标签: scala conditional return


【解决方案1】:

return可能通过抛出异常来实现,因此它可能比声明方法结果的标准方式有一定的开销。 (感谢 Kim Stebel 指出并非总是如此,甚至可能不是经常如此。)

此外,闭包上的return 将从定义闭包的方法返回,而不仅仅是从闭包本身返回。这使得它既有用,又无用从闭包返回结果。

上面的一个例子:

def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = {
  seq foreach { elem =>
    if (predicate(elem)) return Some(elem) // returns from find
  }
  None
}

如果你还是不明白,elem => if (predicate(elem)) return Some(elem)是实现Function1的匿名对象的方法apply,并作为参数传递给foreach。把return去掉就不行了。

【讨论】:

  • 返回并不总是使用异常来实现。只需编译一个带有 return 语句的简单 while 循环,然后使用 javap -v 查看输出。事实上,我希望看到任何以这种方式实现 return 的示例。
  • @KimStebel 有趣,我不知道 Scala 优化了这种情况。举个例子,看我回答中的代码就行了。
  • 当你说一个 clousure 上的 return 将从定义它的方法返回,而不是从 clousure itefl 返回时,我当然明白你的意思。正如您在此处stackoverflow.com/questions/11929485/… 解释的那样,我已经为此感到烦恼
  • 在您提供的示例中,return 会让您无法找到,这是完全有道理的,我希望有另一个 return 语句可以让您摆脱困境......
【解决方案2】:

一个缺点是无法推断返回类型。其他一切都是风格问题。对您来说似乎不清楚或令人困惑的事情对其他人来说可能是完全“自然”的。

【讨论】:

    【解决方案3】:

    显式返回会破坏控制流。例如,如果您有这样的声明

    if(isAuth(user)) {
     return getProfile(user)
    }
    else {
     return None
    }
    

    控制结构(if)没有完成,这就是我认为它更令人困惑的原因。对我来说,这类似于一个 break 语句。此外,Scalas 的“一切都是价值”原则减少了使用显式返回的需要,从而减少了使用仅对 def 语句有用的关键字的人:

    // start 
    def someString:String = return "somestring"
    
    // def without return 
    def someString = "somestring"
    
    // after refactoring
    val someString = "somestring"    
    

    您看到必须添加类型注释,并且在将 def 更改为 val 时需要删除返回。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多