【问题标题】:call function until it returns None in scala调用函数,直到它在scala中返回None
【发布时间】:2014-12-12 00:49:32
【问题描述】:

有没有一种 scala 方式来调用这个函数,直到它返回 None(除了默认的 java 循环和检查方式)

def process(
  writer: Option[FileWriter],
  request: SomeRequest
)(nextId: Option[String], pageNumber: Int): Option[String] = {

这个函数已经在 foldLeft 中被调用,在另一种情况下我不想碰。此外,由于它被一遍又一遍地调用,如果是 Some(nextId) 而不是 None,我需要将返回值传递给 nextId 参数。

否则,我想我可以做一个 var nextId = retValue 但我讨厌在 scala 中使用 vars。感觉我做错了。

谢谢, 院长

【问题讨论】:

    标签: scala


    【解决方案1】:

    你不能定义另一个调用你的函数的函数,像这样:

       import scala.annotation.tailrec
    
       @tailrec
       def loop(wrt:Option[FileWriter], req:SomeRequest)(nxt:Option[String], pg:Int) = {
         process(wrt, req)(nxt, pg) match {
           case res:Some[String] =>
             loop(wrt, req)(res, pg + 1)
           case None =>
             // whatever you need to do when you are done
         }
       }
    

    编辑:添加了明确的@tailrec 注释

    【讨论】:

    • 这是尾递归(我不想让堆栈溢出)。在我看来它是尾递归的。
    • 是的。您始终可以添加 @tailrec 注释。如果不是尾递归,编译器会报错。
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    相关资源
    最近更新 更多