Twitter的"有效scala"经纪人示例和尾递归

nai*_*rbv 1 memory stack-overflow recursion scala

在twitter发布的文档" Effective Scala "中,我看到了一个代码示例:

class Pool(conns: Seq[Conn]) {
  private[this] val waiters = new Broker[Conn]
  private[this] val returnConn = new Broker[Conn]

  val get: Offer[Conn] = waiters.recv
  def put(c: Conn) { returnConn ! c }

  private[this] def loop(connq: Queue[Conn]) {
    Offer.choose(
      if (connq.isEmpty) Offer.never else {
        val (head, rest) = connq.dequeue
        waiters.send(head) { _ => loop(rest) }
      },
      returnConn.recv { c => loop(connq enqueue c) }
    ).sync()
  }

  loop(Queue.empty ++ conns)
}
Run Code Online (Sandbox Code Playgroud)

代码似乎不是尾递归的,并且没有注释.由于这是一个连接池,可能会在程序的生命周期中保持运行,这会阻止像这样的池最终炸毁堆栈,并生成StackOverflowException?

Abh*_*kar 6

代码根本不是递归的!loop不称呼自己.它通过封锁{ _ => loop(rest) }{ c => loop(connq enqueue c) }waiters.sendreturnConn.recv其分别调用loop一次.没有递归因此没有堆栈溢出.