scala 递归如何与内部方法一起工作?

bnlyeluc  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(110)

我正在尝试理解下面的代码。

object ImplicitDemo {

  def calculate(f: => Int) = f * 37

  implicit class IntWithTimes(x: Int) {
        def times[A](f: => A) : Unit = {
          def loop(current: Int): Unit =
            if(current > 0) {
              f
              loop(current - 1)
            }
          f
          loop(x)
        }
  }
  def main (args: Array[String]): Unit ={

    (-5).times(println("abc"))

  }
}

IntWithTimesInt的隐式类,这意味着它拥有Int所具有的一切加上times函数。
当我调用(-5).times(println("abc"))时,在这个部分中,println("abc")被赋值给ff: => Atimes函数也有自己的主体。
因此,当times主体被调用时,内部函数loop也会被调用。为什么current的值等于x?这是我的第一个怀疑……难以理解这一点。
第二个疑问是,它是如何从loop函数体中出来的?直到x > 0,它将继续在if条件下运行,并继续调用嵌套的loop,一旦(x or current < 0),它将转到loop(x).这里它似乎被困在循环中..它是如何从loop's主体中出来的?
请帮助我消除这一疑虑。
谢谢

9njqaruj

9njqaruj1#

为什么当前值等于x?
因为先使用xloop(x)调用loop方法。
currentloop方法的参数,其他任何地方都不存在。
它是怎么从循环函数体中出来的?在x>0之前,它将继续执行If条件并继续调用嵌套循环
因为每次都使用current-1(而不是x)调用loop,因此current在某个点将等于0,并且不会调用if部分。
一旦输出(x或电流<0),它就进入循环(X)
不是的。loop(x)是从times到方法loop的第一次也是唯一一次调用。def loop不调用loop,它是一个方法的声明。
请注意,在上面解释的所有行为中,都没有与按名称传递参数f相关的内容。
编辑:您可能已经注意到,从-5开始实际上甚至不会进入递归。

相关问题