【问题标题】:LinearSeqOptimized#find Reference CopyLinearSeqOptimized#find 参考副本
【发布时间】:2013-12-22 21:28:12
【问题描述】:

Scala 2.10.0LinearSeqOptimized.scala中对LinearSeqOptimized#find的实现,为什么一定要调用var these = this呢?

为什么不能简单地使用this

  override /*IterableLike*/
  def find(p: A => Boolean): Option[A] = {
    var these = this
    while (!these.isEmpty) {
      if (p(these.head)) return Some(these.head)
      these = these.tail
    }
    None
  }

【问题讨论】:

    标签: algorithm scala collections


    【解决方案1】:

    因为你必须在循环外有相同的条件和操作,然后开始使用这些。

    将每个人都放在同一个篮子中并在循环本身中完成所有操作要简单得多。示例:

    def find(p: A => Boolean): Option[A] = {
    
      if (!this.isEmpty && p(this.head)) {
        return Some(this.head)
      }
    
      var these = this.tail
    
      while (!these.isEmpty) {
        if (p(these.head)) return Some(these.head)
        these = these.tail
      }
    
      None
    }
    

    如你所见,不是很聪明。

    您也可以轻松地将其实现为 @tailrec 操作:

    @tailrec final def find[A](p : A => Boolean) : Option[A] = {    
      if ( this.isEmpty ) {
        None
      } else {
        if ( p(this.head) ) {
          Some(this.head)
        } else {
          this.tail.find(p)
        }
      }
    }
    

    在 Scala 中并没有这样做,因为 tailrec 调用必须是最终的或私有的。

    【讨论】:

    • 是的,因为你不会得到下一个尾巴,而是当前的尾巴,这将是一个无限循环。
    • 包含一个简单的tailrec 解决方案,这可能是您的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2011-07-29
    • 2019-11-29
    • 2018-04-11
    相关资源
    最近更新 更多